1. 程式人生 > >CFF 1028 判斷互質(求最大公約數),歐幾里得演算法,輾轉相除法

CFF 1028 判斷互質(求最大公約數),歐幾里得演算法,輾轉相除法

題目:

輸入兩個正整數m和n,判斷m和n是否互質(即最大公約數為1),是則輸出Yes,否則輸出No。

輸入輸出:

輸入兩個整數m和n,中間用空格隔開。

如互質輸出Yes,否則輸出No。

樣例:

36 56 No
7 9 Yes

資料範圍:

1<=n,m<2^31

分析:

判斷兩個數是否互質,起始就是求它們的最大公約數,如果最大公約數為1,那麼互質,否則,不是互質。

判斷兩個數是否互質,或者說求兩個數的最大公約數,效率較高的是輾轉相除法。

程式碼如下:

#include<iostream>
using namespace std
; int main(){ int m, n, r; cin>>m>>n; do{ r = m % n; m = n; n = r; } while(r != 0); if(m == 1){ cout<<"Yes"<<endl; } else { cout<<"No"<<endl; } return 0; }

我們來分析一下,比如我們輸入的第一組數是7 和9,

那麼運算過程如下:

r = m % n r = 7 % 9 = 7
m = n m = 9
n = r n = 7

while語句判斷 r=7並不等於 0,所以繼續執行迴圈體。

r = m % n r = 9 % 7 = 2
m = n m = 7
n = r n =2

while語句判斷 r=2並不等於 0,所以繼續執行迴圈體。

r = m % n r = 7 % 2 = 1
m = n m = 2
n = r n =1

while語句判斷 r=1並不等於 0,所以繼續執行迴圈體。

r = m % n r = 2 % 1 = 0
m = n m = 1
n = r n =0

此時判斷 r = 0,所以結束迴圈。

最後一個被整除的數,是1,1賦值給了m,所以m就是它們的最大公約數。

當輸入4和2時,運算過程如下:

r = m % n r = 4 % 2 = 0
m = n m = 2
n = r n =0

判斷while語句,因為 r = 0,所以結束迴圈,所以2和4的最大公約
數就是m = 2

輾轉相除法的算術原理:

在a = b*q + r 中,除數 b 和 r 能被同一個數整除,那麼被除數也能
被這個數整除。
或者可以這麼說,除數與餘數的最大公約數,就是被除數和除數的最大公約數;如果反過來說,被除數與除數的最大公約數,就是除數與餘數的最大公約數。