常用基础算法C++实现

本文详细介绍了几种常见的基础算法,包括素数判断、最大公约数及最小公倍数的求解方法,以及大数相乘的算法实现。通过具体的例子和代码展示了算法的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 }    

 

转载于:https://www.cnblogs.com/sn944/p/5933637.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值