CFF 1028 判断互质(求最大公约数),欧几里得算法,辗转相除法

时间:2022-04-25 09:46:52

题目:

输入两个正整数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 能被同一个数整除,那么被除数也能
被这个数整除。
或者可以这么说,除数与余数的最大公约数,就是被除数和除数的最大公约数;如果反过来说,被除数与除数的最大公约数,就是除数与余数的最大公约数。