按照欧几里得算法,编写程序,求用户从键盘输入的任意两个整数的最大公因数。
程序的运行结果如下所示:
输入:
120 80
输出:
40
分析:根据欧几里得算法
gcd(a,b)=gcd(b,a%b)证明
不妨假设 a>b
则a=k*b+r①
因为gcd是a、b的最大公约数,所以可以设a=gcd(a,b)*m②,b=gcd(a,b)*n③
联立上面的三个式子得gcd(a,b)*m=k*gcd(a,b)*n+r,整理得r=k*gcd(a,b)*n-gcd(a,b)*m,提取公因式得r=gcd(a,b)(n*k+m)
又因为r=a-k*b=a%b,所以gcd(a,b)=gcd(a,a%b)=gcd(b,a%b)
因此程序实现的依据就是
gcd(a1,b1)=gcd(b1,a1%b1)=gcd(a2,b2)=................=gcd(an-1,bn-1)=bn-1 (an-1%bn-1=0时) [或=gcd(an,bn)=an (bn=0时)]
所以我们就可以用两种方法,递归和非递归两种做法来解决这个问题
#include<iostream>
using namespace std;
int gcd(int m, int n) //递归算法
{
if (n==0) return m;
return (gcd(n,m%n));
}
int gcd2(int m, int n) //递推算法
{
while (n>0)
{
int tem=n;
n=m%n;
m=tem;
}
return m;
}
int main()
{
int a,b,ans,tem;
cin>>a>>b;
if (a<b)
{
tem=a;
a=b;
b=tem;
}
ans=gcd2(a,b);
cout<<ans;
return 0;
}