辗转相除法,又名欧几里德算法。
用于计算两数最大公约数(gcd)
主要思想是:gcd(a,b)=gcd(b,a%b) (a>=b)
原理证明也很简单:
先不妨设a=kb+r,a=cx,b=cy(c为最大公约数,也即x和y已无公因式)
r=a-kb=c(x-ky)=>说明c是约数,那么只需证明c是最大的公约数,也即x-ky和y无公因式即可
这里的证明采用反证法
假设x-ky=md,y=nd (d>1)
则x=md+ky=md+knd=d(m+kn)
a=cx=(m+kn)cd,b=cy=ncd =>a与b存在一个公约数cd>c
与c是a与b的最大公约数矛盾
也即结论错误,二者无公因式
QED
那么清楚原理后,代码实现就很简单了
你可以写成递归的
int gcd(int a,int b