1. 程式人生 > >【如皋OJ】C++判斷互質

【如皋OJ】C++判斷互質

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;
}