最大公约数与最小公倍数
来源:互联网 发布: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
- 求最大公约数与最小公倍数
- 最大公约数与最小公倍数问题
- 求最大公约数与最小公倍数
- 最大公约数与最小公倍数
- 最大公约数与最小公倍数
- 求最大公约数与最小公倍数
- 最大公约数 与 最小公倍数
- 最大公约数与最小公倍数源码
- 最小公倍数与最大公约数
- 最大公约数与最小公倍数
- 最大公约数与最小公倍数
- 最大公约数与最小公倍数
- 最小公倍数与最大公约数
- 最大公约数与最小公倍数
- 最大公约数与最小公倍数算法
- 最大公约数与最小公倍数
- 最大公约数与最小公倍数
- 最大公约数与最小公倍数
- 直接拿来用!十大Material Design开源项目
- 你必须了解的Session的本质
- mac添加HTMLTestRunner模块
- poj_3414
- elasticsearch安装参数配置注意事项
- 最大公约数与最小公倍数
- window SDK 7.1安装(Direct show)
- C 大整数相加
- Android Service完全解析,关于服务你所需知道的一切(上)
- web开发
- 数据结构与算法之----栈与队列
- java对象转化为json字符串
- 统计-stats
- Android各种荧幕分辨率(VGA、HVGA、QVGA、WQVGA