【如皋OJ】C++判斷互質
阿新 • • 發佈:2019-01-01
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; }