求两个数的最大公约数
2016-04-13 23:00
204 查看
两个数的最大公约数
辗转反除法对应公式:f(x, y) = f(y, x%y),其中x>=y>0。
程序实现如下:
int gcd1(int x, int y) { if (x < y) return gcd1(y, x); return (!y) ? x : gcd1(y, x % y); }
大整数减法
因辗转反除法利用取模运算,计算开销大,故转换为大整数减法实现。
对应公式:f(x, y) = f(x-y, y),其中x>=y>0。
程序实现如下:
int gcd2(int x, int y) { if (x < y) return gcd2(y, x); return (!y) ? x : gcd2(x - y, y); }
位运算
由于辗转反除法计算复杂,而大整数减法虽计算不复杂,但迭代次数太多,故分析公约数特点,利用位运算实现。
对应公式:
1)x,y均为偶数,f(x, y)=2*f(x/2, y/2)=f(x>>1, y>>1)<<1
2)仅x为偶数,f(x, y)=f(x/2, y)=f(x>>1, y)
3)仅y为偶数,f(x, y)=f(x, y/2)=f(x, y>>1)
4)x,y均为奇数,f(x,y)=f(y, x-y)
其中x>=y>0。
实现程序如下:
int gcd3(int x, int y) { if (x < y) return gcd3(y, x); if (y == 0) return x; else { if (x % 2 == 0) { if (y % 2 == 0) return (gcd3(x >> 1, y >> 1) << 1); else return gcd3(x >> 1, y); } else { if (y % 2 == 0) return gcd3(x, y >> 1); else return gcd3(x - y, y); } } }
参考文献:编程之美
相关文章推荐
- Java中使用辗转相除法求最大公约数
- 使用Python求解最大公约数的实现方法
- Python实现求最大公约数及判断素数的方法
- 计算两个数的最大公约数 gcd(a,b)
- 求最大公约数
- 数论算法初步理解(1)
- Java学习历程(关于最大公约数和最小公倍数)
- 最大公约数与最小公倍数的计算
- 输入两个数,算他们的最小公倍数和最大公约数
- 欧几里德算法(辗转相除法):求两个整数最大公约数
- “铺地砖”问题
- 最大公约数问题
- 求最大公约数 C++
- 算法概论的第一次作业:最大公约数
- 9.1 ChocolatesByNumbers
- 算法-最大公约数
- javascript 求最大公约数
- hdu acmsteps 2-1-3相遇周期
- 求最大公约数
- 第一周作业---键盘输入两个整数,并计算他们的最大公约数