今天学习了一下辗转相除法,又名欧几里得算法,这是一个求最大公约数的一种方法,在此,在这里分享一下学习成果。
何为辗转相除法? 具体做法是,用较大的数(被除数) ÷ 较小的数(除数) ,再用他俩的余数 去做除数,较小的数做被除数,如此反复,直到余数为0为止,那么最后的除数就是这两个数的最大公约数。这里的操作我们就想到了递归。
证明方法如下:
若求a,b的最大公约数,a可以表示成 a = kb+r(a,b,k,r 都为整数,且 r < b),r = a mod b
假设x 是a,b 的一个公约数,即a,b都可被 d 整除
根据 a = kb+r 可知 r = a-kb, 给等式左右分别除 d, 则 r/d 也为一个整数,因此得出 d 既是 a,b的约数,也是 r 的约数。
因此,(a,b) 和 (b, a mod b )的公约数是一样的 ,其最大公约数也必然相等。
现在呢,用代码实现以下:
c++ 版本:
#include<stdio.h> #include<iostream> #include<math.h> using namespace std; int gcd(int a, int b){ if(a < b) swap(a,b); return b == 0 ? a : gcd(b,a%b); } int main() { int a,b,c; scanf("%d %d",&a,&b); printf("%d",gcd(a,b)); }
JavaScript 版本:
function gcd(a, b) { if (a % b == 0) return b; return gcd(b, a % b); }