求最大公约数和最小公倍数C++

思路:
我们拿到一个问题首先要做的是理清思路,对于数学问题来说,我们一般是先用数学的思维来思考如何解决这个问题,然后再把它转化成为计算机语言

如何求最大公约数
那么如何求最大公约数呢?如果这是一个小学数学题,我们可能会去拼凑,也就是我们常说的穷举法。“正规一点”的我们会用非常耳熟的辗转相除法(也就是欧几里得算法),我也暂时只介绍这一种方法,能够将他写好写熟练就非常不错了,其他的方法可以自己研究一下。

辗转相除法
说到辗转相除法,大家估计是又熟悉又陌生,那么我就不卖关子了,开剖吧!

首先呢,我们要相除,就得有两个数 ,假设为32和12
然后,根据32/12=2……8,得到32除以12的余数为8
接着,再将开始的两个数中较小的数12和第一次取余的余数8放在一起
继续进行取余的操作,即12/8=1……4,得到12处于8的余数为4
同样的,将8和4放在一起
然后继续取余,8/4=2……0,此时取余已经为0了,表明辗转相除法已经到头了。(辗转辗转,就是这样一步一步搞下来的)
相信举实数的例子看起来更容易理解他的操作步骤,不像直接看代码或者用字母替代的步骤那样难嚼,不过接下来再用“官方”一点的语言描述一下这个过程,相信你们就能看懂了。

设两数为a、b(a>b),求a和b最大公约数(a,b)的步骤如下:
用a除以b,得a÷b=q…r1(0≤r1)。
若r1=0,则(a,b)=b;
若r1≠0,则再用b除以r1,得b÷r1=q…r2 (0≤r2).
若r2=0,则(a,b)=r1,
若r2≠0,则继续用r1除以r2,
如此下去,直到能整除为止。其最后一个为被除数的余数的除数即为(a, b)。1

如何求最小公倍数
求最小公倍数可以借助最大公约数,因为最小公倍数=两数之积除以最大公约数

如此一来,求最小公倍数就显得如此简单,可以先求出最大公约数,再拿两数之积除以它便能得到最小公倍数了!

代码:

#include <iostream>

using namespace std;

int gcd(int,int); //调用最大公约数的函数声明
int lcm(int,int); //调用最小公倍数的函数声明

int main(){
    int num1,num2,g,l;
    cout << "请输入两个数:";
    cin >> num1 >> num2;
    cout << "你输入的两个数为:" << num1 << " " << num2 << endl; // 测试,此行可省略
    g = gcd(num1, num2); //传参求值
    l = lcm(num1, num2); //传参求值
    cout << "他们的最大公约数是:" << g << endl; //输出结果
    cout << "他们的最小公倍数是:" << l << endl; //输出结果
    return 0;
}

int gcd(int x,int y){
    int temp,a;
    // 保证x<y
    if(x<y){
        temp = x;
        x = y;
        y = temp;
    } //其实这里可以稍作改进,不用提前将他们按照顺序排列,评论区可以讨论一下
    while(y!=0){
        a = x % y;
        x = y;
        y = a;
    }
    return x; //返回x给main函数中的g
}

int lcm(int m,int n){
    int g1,b;
    g1 = gcd(m,n); //调用求最大公约数的函数
    b = (m*n) / g1; //最小公倍数=两数之积/最大公约数
    return b; //返回b给main函数中的l
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值