辗转相除法
话不多说,先上最强代码:
int gcd(int a, int b){
return b == 0 ? a : gcd(b, a % b);
}
此函数返回值就为a和b的最大公约数
辗转相除法的介绍
辗转相除 可以求最大公约数,顾名思义,反复的除,最终得到两数的最大公约数。
首先我们来分析下定理:
定理:两个整数的最大公约数等于其中较小的那个数和两数相除余数的最大公约数。最大公约数(Greatest Common Divisor)缩写为GCD。
gcd(a,b) = gcd(b,a mod b) (不妨设a>b 且r=a mod b ,r不为0)
文字不好理解,举个实例:
134 / 18 = 7 … 8
18 / 8 = 2 … 2
8 / 2 = 4 … 0
看清了吧,是不是和定理一模一样,所以我们要找最大公约数,而134 /18的和8 / 2的最大公约数相等,所以我们只需要求出8 / 2的最大公约数,是不是就是开头说的换了两个数再求,而我们要知道,因为两数相除,余数为0,其除数必定为最大公约数,所以这里的2也就是我们要找的138 / 18 的最大公约数。至于证明,百度搜索,都有。主要证明思路就是,有a/b余r一式, 先假设y为a,b的公约数,再证明b,r的公约数也为y。
再上个流程图:
代码实现:
int gcd(int a,int b){
int r=1;// 余数,赋初值为1
while(r!=0){// 如果a<b,亦无需颠倒ab,在计算中商0余除数本身,在下次运算中自可颠倒回来
r = a % b;
a = b;
b = r;
}
return a;
}