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 能被同一個數整除,那麼被除數也能
被這個數整除。
或者可以這麼說,除數與餘數的最大公約數,就是被除數和除數的最大公約數;如果反過來說,被除數與除數的最大公約數,就是除數與餘數的最大公約數。