過了這么久,終於知道了輾轉相處的證明了,以前只是記住了,但不是真的很理解,現在寫一下它的證明,以便下次忘了的時候看一下。輾轉相除是求兩個數的最大公約數的。
要證這個定理成立,只需要證明 gcd(a, b) = gcd(b, a % b) 就行了
證明:令a % b = r, 所以a = k * b + r, 所以r = a - k * b,假設d為a,b的一個公約數,那么 d|a, d|b,(d|a的意思就是d整除a,也就是a能被d整除),所以a - k * b 也一定能被d整除,即 d|r, 也就是 d|(a % b), 因此d也是b 和 (a % b)的公約數,因此a,b 的公約數和b, (a%b)的公約數也是一樣的,其最大公約數也一定相同,所以gcd(a, b) = gcd(b, a % b);
所以有了這個等式之后,基本上就算完了,還有一步就是怎么到最后求個具體的數,當b等於0時候就可以了,因為最后遞歸好多還是和原來的那個公寓數是相同的,最后有0了,他倆的最大公約數就是他本身了,也就是a了,用遞歸代碼如下
1 int gcd(int a, int b) 2 { 3 return (b == 0 ? a : gcd(b, a % b)); 4 }