輾轉相除求最大公約數原理

2021-08-16 16:30:10 字數 960 閱讀 6391

首先看 **如下,**並不難,很多人都會寫。

public

static

intf(int a, int b)

return a;

}

舉個例子,例如6,8按照**執行一遍。

a b68

8662

20

但是這個演算法的原理可是折磨了我很久,不知道大家懂不懂這個原理

兩個數的最大公約數是指能同時整除它們的最大正整數。 設兩數為a、b(a≥b),求a和b最大公約數 的步驟如下:

(1)用a除以b(a≥b),得 a / b = q…r1 。 (2)若 r1 = 0 ,則 (a, b) = b; (3)若 r1

不等於 0 ,則再用b除以 r1 ,得b / r1 = q…r2(此處q不是上方的q). (4)若 r2=0 ,則(a,b)=r1

;若 r2不等於0 ,則繼續用r1除以 r2 ,……,如此下去,直到能整除為止。 其最後乙個餘數為0的除數即為 (a,b)

的最大公約數。

為什麼這樣進行遞迴除下去我也不懂,知道看到數論吧的以為大神發帖

假設有兩個數x和y,存在乙個最大公約數z=(x,y),即x和y都有公因數z,

那麼x一定能被z整除,y也一定能被z整除,所以x和y的線性組合mx±ny也一定能被z整除。(m和n可取任意整數)

對於輾轉相除法來說,思路就是:若x>y,設x/y=n餘c,則x能表示成x=ny+c的形式,將ny移到左邊就是x-ny=c,由於一般形式的mx±ny能被z整除,所以等號左邊的x-ny(作為mx±ny的乙個特例)就能被z整除,即x除y的餘數c也能被z整除。

由以上的推理可知 a / b的餘數 也能被 (a,b)的最大公約數整除,因此就將問題轉化為求 其中較小的數和餘數的最大公約數,最終將範圍不斷減小,從而求出答案。

輾轉相除求最大公約數

什麼叫輾轉相除法求最大公約數 輾轉相除法求兩個數的最大公約數的步驟如下 先用大的乙個數除大的乙個數,得第乙個餘數 再用兩個數中較小的乙個數除第乙個餘數,得第二個餘數 又用第乙個餘數除第二個餘數,得第三個餘數 這樣逐次用後乙個數去除前乙個餘數,直到餘數是0為止。那麼,最後乙個除數就是所求的最大公約數 ...

輾轉相除求最大公約數

限制 總時間限制 1000ms 記憶體限制 65536kb 描述 給定兩個正整數,求它們的最大公約數。輸入 輸入一行,包含兩個正整數 1,000,000,000 輸出 輸出乙個正整數,即這兩個正整數的最大公約數。樣例輸入 6 9樣例輸出 3提示 求最大公約數可以使用輾轉相除法 假設a b 0,那麼a...

輾轉相除法求最大公約數

之前總結過一次高德納taocp中的最大公約數求解,其實課後題中的演算法修改要求實現的是輾轉相除法求解最大公約數。這個題目我最初的理解理解錯了,自然也沒有做出標準答案。現在按照標準答案的解答寫一下相應的 實現 defmaxcommdivisor m,n while m n 0 m m n if m 0...