古代就有乙個很好的演算法
來計算a,b的最大公約數(a,b),稱為輾轉相除法,在西方稱為euclid演算法。
下面通過計算(1397,2413)來闡述這一演算法。
首先,我們用這兩個數1397和2413中兩個數中小的去除大的,得商為1,餘數為1016。將原來兩個數中大的2413扔掉,將1397作為大數,將餘數1016作為新的小數。重複上面的過程:用1016去除1397,得商為2,餘數為245。扔掉1397,將381作為除數,1016作為小的。用381去除1016,得商為2餘數為254,扔掉1016,用254 去除381,得商為1 ,餘數為127,再扔掉381,用127去除254,發現能整除,於是127就是最大公約數。
整個計算過程為:
2413=1397*1+1016,
1397=1016*1+381,
1016=381*2+254,
381=254*1+127,
254=127*2+0,
所以(1397,2413)=127。
為什麼這樣求出是就是最大公約數呢?下面對a,b為正整數(a>b)的情形給出說明。
根據定理10.2,商q和餘r數滿足a=bq+r,且0≤r ≤b-1. 若r=0,顯然(a,b)=b;若r≠0,由於a=bq+r,每個能整除b,r的整數都能整除a,當然能同時整除a,b,所以(b,r)|(a,b);另一方面,r=a-bq,每個能整除a,b的整數都能整除r, 當然能同時整除b,r, 所以(a,b)|(b,r).因此(a,b)=(b,r). 輾轉相除法進行一步後,b 取代原來的a,用r取代原來的b,最大公約數保持不變,因此我們的演算法可以一直進行下去:
a=bq1+r1,
b=r1q2+r2,
r1=r2q3+r3,
…rk-3=rk-2qk-1+rk-1,
rk-2=rk-1qk.
一旦出現rk-2=rk-1qk(即rk=0),則有 rk-1=(rk-2,rk-1)=…=(r1,r2)=(b,r1)=(a,b).
上述的求最大公約數的方法就稱為輾轉相除法。
輾轉相除法求最大公約數
之前總結過一次高德納taocp中的最大公約數求解,其實課後題中的演算法修改要求實現的是輾轉相除法求解最大公約數。這個題目我最初的理解理解錯了,自然也沒有做出標準答案。現在按照標準答案的解答寫一下相應的 實現 defmaxcommdivisor m,n while m n 0 m m n if m 0...
求最大公約數 輾轉相除法
設求a和b的最大公約數c 則可看做邊長分別為a和b的矩形,可恰好被邊長為c的正方形無縫隙填滿 方法 不斷地用長邊除以短邊取餘數,直到長邊與短邊相等,即為所求正方形 給定平面上的兩個格點p1 x1,y1 p2 x2,y2 線段p1p2上,除p1和p2以外一共有幾個點。示例 p1 3,9 p2 7,1 ...
輾轉相除求最大公約數原理
首先看 如下,並不難,很多人都會寫。public static intf int a,int b return a 舉個例子,例如6,8按照 執行一遍。a b68 8662 20但是這個演算法的原理可是折磨了我很久,不知道大家懂不懂這個原理 兩個數的最大公約數是指能同時整除它們的最大正整數。設兩數為...