求m和n的最大公约数(m>0,n>0)

方法一:递归,辗转相除

#include<bits/stdc++.h>
using namespace std;
int gcd(int,int);
int gcd(int m,int n)
{
return n==0 ? m : gcd(n,m%n);
}
int main()
{
int m,n;
cin>>m>>n;
cout<<gcd(m,n)<<endl;
return 0;
}

方法二:递归,“二进制”

(1)递归终止条件:gcd(m,m)=m

(2)递归关系式:

n<m时,gcd(m,n)=gcd(n,m)

m为偶数,n为偶数时:gcd(m,n)=2*gcd(m/2,n/2)

m为偶数,n为奇数时:gcd(m,n)=gcd(m/2,n)

m为奇数,n为偶数时:gcd(m,n)=gcd(m,n/2)

m为奇数,n为奇数时:gcd(m,n)=gcd(n,m-n)

参考代码:

#include<bits/stdc++.h>
using namespace std;
int gcd(int,int);
int gcd(int m,int n)
{
if(m==n) return m;
if(m<n) return gcd(n,m);
if(m%2==0)
{
if(n%2==0) return 2*gcd(m/2,n/2);
else return gcd(m/2,n);
}
if(m%2!=0)
{
if(n%2==0) return gcd(m,n/2);
else return gcd(n,m-n);
}
}
int main()
{
int m,n;
cin>>m>>n;
cout<<gcd(m,n)<<endl;
return 0;
}

 

posted on 2021-01-08 08:55  我不会秃头  阅读(604)  评论(0)    收藏  举报