求两个正整数m,n的最大公约数

1.欧几里得算法:gcd(m,n);
    m>=n,其递归定义为:
     n=0时 gcd(m,n)=m;
      n>0时 gcd(m,n)=gcd(n,m%n);
    eg:m=60,n=24
       gcd(60,24)=gcd(24,60%24=12)
       gcd(24,12)=gcd(12,24%12=0)
       gcd(12,0)=12
    自然语言描述:
     1.如果n=0,则返回m为最大公约数,同时过程结束,否则进入第二步
     2.令n去除m,得到余数r,将n的值赋给m,将r的值赋给n,返回第一步

#include<iostream>
using namespace std;
int gcd(int m,int n)
{
    if(n==0)
        return m;
    else
        return gcd(n,m%n);
}
int main()
{
    int m,n; cin>>m>>n;
    cout<<gcd(m,n);
    return 0;
}

2.连续整数检测算法
    算法思想:
      基于最大公约数的定义:同时整除两个整数的最大整数;
      显然,最大公约数t不会大于两者中最小的那一个,则令 t=min(m,n);
      用t除m,n,若除尽则t为最大公约数;否则,令t=t-1,继续尝试;

#include<iostream>
using namespace std;
int gcd(int m,int n,int t)
{
    if(m%t==0&&n%t==0)
        return t;
    else
        return gcd(m,n,t-1);

}
int main()
{
    int m,n;cin>>m>>n;
    int t=min(m,n);
    cout<<gcd(m,n,t);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值