辗转相除法是一个比较重要的基础算法,掌握其原理和简单形式可以更快速的刷题
int gcd(int a,int b){
if(a<b) swap(a,b);
return (a%b) ? gcd(a%b,b) : b ;
}
int gcd(int a,int b){
return (a%b) ? gcd(b, a%b) : b ;
}
其计算原理依赖于下面的定理: (摘自百度百科)
定理:两个整数的最大公约数等于其中较小的那个数和两数相除余数的最大公约数。最大公约数(Greatest Common Divisor)缩写为GCD。
gcd(a,b) = gcd(b,a mod b) (不妨设a>b)
其实在操作中发现,即使没有a>b这个条件,在第一次运算后,a%b的值必然会比b小,因此gcb(b,a%b) 这种形式不必交换元素。 巧妙的利用了三目运算符和递归一行代码就实现了求最大公约数
当然为了保险起见加入swap也可
非递归实现 (https://blog.csdn.net/chenfs1992/article/details/44689575)
int gcd(int a, int b){
int temp = a;
while(a%b != 0){
a = b;
b = temp%b;
temp = a;
}
return b;
}
补充:
求最小公倍数: a*b/(gcb(a,b)