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