最大公约数和最小公倍数

 看《数据结构》,忽然发现最大公约数原来这么简单,上学的时候是咋学的?

 

原理:

1,最大公约数(G C D),使用欧几里德算法,也叫辗转求余法
  g cd(a,b)=gc d(b,a mod b)
  当b为0时,两数的最大公约数即为a

2,最小公倍数(LCM)

  lcm(a, b)*gc d(a, b) = a*b


 

递归版本代码:

  1. //两个数的最大公约数--欧几里得算法
  2. int gcd(int a, int b)
  3. {
  4.     if (a < b)
  5.         swap(a, b);
  6.     
  7.     if (b == 0)
  8.         return a;
  9.     return gcd(b, a%b);
  10. }
  11. //两个数的最小公倍数(lcm)算法:lcm(a, b)*gcd(a, b) = a*b
  12. int lcm(int a, int b)
  13. {
  14.     return a*b/gcd(a, b);
  15. }

非递归版本

  1. int gcd2(int a, int b) //最大公约数
  2. {
  3.     while((b!=0) && (a!=0))
  4.         a >= b ? a%= b : b %= a;
  5.     return a >= b ? a : b;
  6. }
  7. int lcm2(int a, int b) //最小公倍数
  8. {
  9.     return a * b / gcd2(a,b);
  10. }

局限:

1,没有处理两个数都是0的情况

2,没写main(),没有using namespace std;

我不喜欢一个算法和main()绑定到一起,怎么复用啊?没办法。

 

[20081209补记]

看完了《编程之美》之后,这个问题有了更多的解法。

两种方案,是:

1)使用mod比较费时间,改为减法;但是这个的风险非常大,如果取1和10000的.....所以,使用下一种方法;

2)两个都是偶数:除以2,作为公约数的一部分;

一个奇数一个偶数:偶数除以2,不作为公约数的一部分;

两个奇数:减法

这个效率非常好。

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值