欧几里得算法
欧几里德算法又称辗转相除法,是指用于计算两个非负整数a,b的最大公约数。
百度百科所言↑
正如其所言,辗转相除法相信大家小学时便有所听闻
就是设\(a>b,\)
则有\(gcd(a,b)==gcd(b,a\)%\(b)\)
可以感性理解下为何
严格的证明比较复杂,有兴趣者见下:
假设其\(gcd\)为\(k\),\(z=a%b\)
则存在\(x,y,q\)使得\(a=kx,b=ky,z=a+qb\)
则\(gcd(x,y)=1,z=a+qb=kx+q(ky)=k(x+qy)\)
则\(gcd(b,z)=gcd(ky,k(x+qy))\)有\(k\)这个因数
设\(gcd((x+qy),y)=c\)
存在\(m,n\)使得\(x+qy=mc,y=nc\)
则\(x=mc-qy=mc-qnc=c(m-qn)\)
\(a=kx=kc(m-qn),b=ky=knc\)
则\(gcd(ab)=k=gcd(kc(m-qn),kcn)=kc\)
所以\(kc=k,c=1,\)则\(gcd((x+qy),y)=1\)
则\(gcd(b,z)=gcd(b,b\)%\(a)=k=gcd(a,b)\)
证毕
(↑↑↑非引用,本人自己打的)
好了这样的话代码就比较好打了,递归下去就好了
其中\(b==0\)时\(return\) \(a\)就基本解决了
好了上代码↓
int gcd(int a,int b){
if(b==0)return a;
return gcd(b,a%b);
}
…………………………(怀疑这段代码出现的意义所在……)………………………………
Reality&Imagine