求任意两个整数的最大公因数

按照欧几里得算法,编写程序,求用户从键盘输入的任意两个整数的最大公因数。

程序的运行结果如下所示:
输入:
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;
}
 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值