1075: ex423:判断互质
时间限制: 1 Sec 内存限制: 128 MB
提交: 162 解决: 78
[提交] [状态] [讨论版] [命题人:外部导入]
题目描述
输入两个正整数m和n,判断m和n是否互质(即最大公约数为1)。
输入
只有1行2个正整数m和n(1<=n,m<231)。
输出
如果2个整数互质,就输出Yes;否则输出No,并在第2行输出这2个整数的最大公约数(注意:这里的要求和教材上不同)。
样例输入
36 56
样例输出
No
4
大家想必听说过欧几里得算法,有了这个算法,这道题就会十分简单。
定理:gcd(a,b) = gcd(b,a mod b),这定理乍一看不容易,可事实上很简单,举个例子,1997和615:
1997=3*615+152
615=4*152+7
152=21*7+5
7=1*5+2
5=2*2+1
2=2*1+0
最后得出1997和615的最大公约数为1。
这有两种写法:
int Euclid_algorithm(int m,int n)
{
int temp;
while(m%n>0)
{
temp=n;
n=m%n;
m=temp;
}
return n;
}
int Euclid_algorithm(int m,int n)
{
if(m%n==0)return n;
else return Euclid_algorithm_1(n,m%n);
}
这时,程序就好写了:
#include<bits/stdc++.h>
using namespace std;
int Euclid_algorithm(int m,int n)
{
if(m%n==0)return n;
else return Euclid_algorithm(n,m%n);
}
int main()
{
int m,n,factor,i;
cin>>m>>n;
if(m<n) swap(m,n);
factor=Euclid_algorithm(m,n);
if(factor==1) cout<<"Yes";
else cout<<"No\n"<<factor;
return 0;
}