zoukankan      html  css  js  c++  java
  • 常用基础算法C++实现

    2016年10月06日10:40:43

    本文记录一些常用的基础算法,只为熟能生巧,内容多的话会建立索引的

    素数(质数)判断

    素数的定义:就是除它本身和1之外,没有其他任何约数的数

    1 bool isPrime(int i)
    2 {
    3     for (int j = 2; j <= sqrt(i * 1.0); j++) {
    4         if (i % j == 0)
    5             return false;
    6     }
    7     return true;
    8 }

    最大公约数

    例如:求24和60的最大公约数,先分解质因数,得24=2×2×2×3,60=2×2×3×5,24与60的全部公有的质因数是2、2、3,它们的积是2×2×3=12,所以,(24,60)=12

     1 int gcd(int a, int b) // greatest common divisor
     2 {
     3      return (!b)?x:gdc(y,x%y);
     4 }
     5 
     6 //或者更容易理解的
     7 int gcd(int a, int b) // greatest common divisor
     8 {
     9     while(a%b){
    10         int tmp = a;
    11         a = b;
    12         b = tmp%b;
    13     }
    14     return b;
    15 }

    有了最大公约数,最小公倍数就很好求了,表示为 a*b / 最大公约数

    大数相乘

    大数的读入和输出都不同于正常数,读入是一字符串的方式读入的,相乘后的数存入到数组中,然后遍历数组输出数据。

    下面看一下数相乘的原理

    a = 34 b = 25

    a和b相乘过程展示

                             b      2                 5

           a    3                 4

                        ----------------------------------------相乘过程,和我们认知中的乘法一样,只是没有进位

                                  8(2X4)         20(4X5)

               6(2X3)       15(3X5)

    ---------------------------------------------------------正常的乘法相加,依旧不进位

               6                 23                 20               

    ---------------------------------------------------------通过进位是不是就能得到我们熟悉的答案了  850

              8                  5                    0

    (6+2(进位))  (3+2(进位))                进位的解释

    通过上面的分析,我们知道了算法的核心思想,接下来就能把算法实现,实现方法如下:

     1 void multiply(const char* a, const char* b){
     2      assert(a != NULL && b != NULL!);
     3      int i, j ,la, lb;
     4      la = strlen(a);
     5      lb = strlen(b);
     6      int s[la+lb] = {0};
     7      for(i = 0; i < la; i++){ //完成相乘,但是没有进位
     8          for(j = 0; j < lb; j++){
     9              s[i+j] += (a[i] - '0')*(b[j]-'0');
    10          }
    11      }
    12      for(i = 0; i < la+lb; i++){ //完成进位
    13          s[i+1] += s[i]/10;
    14          s[i] = s[i]%10;
    15      }
    16      for(i = la+lb; i >= 0; i-- ){
    17          if(s[i] != 0) cout << s[i];
    18      }
    19 }    
  • 相关阅读:
    小甲鱼与客服的对话,代码与解析
    (role,line_spoken) = each_line.split(':',2) 小甲鱼python 一个任务
    python open() 方法 No such file or directory: 应该怎么解决
    并发编程
    并发编程
    并发编程
    并发编程
    并发编程
    并发编程
    并发编程
  • 原文地址:https://www.cnblogs.com/sn944/p/5933637.html
Copyright © 2011-2022 走看看