最大公约数与最小公倍数

来源:互联网 发布:SQL 重启计算机 编辑:程序博客网 时间:2024/04/29 06:51

最大公约数

最大公约数是经常面试考到的题目,复习一下。

辗转相除法(又叫欧几里德算法),非常给力,百科有人提到:

辗转相除法处理大数时非常高效,它需要的步骤不会超过较小数的位数(十进制下)的五倍。加百利·拉梅(Gabriel Lamé)于1844年证明了这点。

1) 递归写法

int gcd(int x, int y){if (x < y) return gcd(y, x);return y == 0 ? x: gcd(y, x-y);}

2)非递归写法

int gcd2(int x, int y){if (x < y) {int n = x;x = y;y = n;}int r;do{r = x % y;x = y;y = r;} while(r);return x;}

利用奇偶性进行位运算,大大的简化计算量

int gcd(int x, int y){if (x < y) return gcd(y, x);if (y == 0) return x;if (!(x%2)) {if (!(y%2)){/* x为偶数 && y为偶数 */return 2 * gcd(x >> 1, y >> 1);} else {/* x为偶数 && y为奇数 */return gcd(x >> 1, y);}} else {if (!(y%2)) {/* x为奇数 && y为偶数 */return gcd(x, y >> 1);} else {/* x为奇数 && y为奇数 */return gcd(y, x - y);}}}

注意:上面的函数,需要自行保证x,y非负数,否则栈溢出。

最小公倍数

好了,现在来看一下最小公倍数如何求,既然能知道最大公约数,那么

记正整数的a和b的最大公约数gcd(a,b),最小公倍数lcm(a,b),于是

a* b = gcd(a,b)*lcm(a,b)

想想什么原因,

简单描述一下,如果a和b有一个共同的因子p,gcd(a,b)中计算过一次,lcm(a,b)计算过一次。

相当于a和b的因子p都被计算在乘积中。

如果q是a或者b的一个因子,q不同时为a和b的因子,那么q只会出现在lcm(a,b)中一次,自然也只会

出现a和b的乘积中一次。

2015-03-17

0 0
原创粉丝点击