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

来源:互联网 发布:如何免费申请邮箱域名 编辑:程序博客网 时间:2024/05/21 05:38

题目:

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

阅读全文
0 0