题解 | 求最小公倍数

求最小公倍数

https://www.nowcoder.com/practice/22948c2cad484e0291350abad86136c3

这其实是一道数学题,两个数a,b的最小公倍数等于a*b/gcd(a,b),gcd表示两者的最大公约数.

所以这道题我们就转为求两个数的最大公约数了。我们可以采用辗转相除法来解决该题:

对两个正整数来说,让较小除以两数的模,chong这其实是一道数学题,两个数a,b的最小公倍数等于a*b/gcd(a,b),gcd表示两者的最大公约数. 所以这道题我们就转为求两个数的最大公约数了。我们可以采用辗转相除法来解决该题: 两个正整数的最大公约数,等于较小的数和它们模的最大公约数。所以我们可以借助这个,让两个数不断地变化,当余数为0时,此时的除数就是两者的最大公约数。1997 ÷ 615 = 3 (余 152)615 ÷ 152 = 4(余7)152 ÷ 7 = 21(余5)7 ÷ 5 = 1 (余2)5 ÷ 2 = 2 (余1)2 ÷ 1 = 2 (余0)至此,最大公约数为1

所以我们便可以借助这个性质来编写代码

有的人可能会有疑惑,不是说较小的数和它们的余数么?可是你写gcd的时候并没有管ab的大小啊?

其实不论谁除谁都是可以的,如果大除小自然是没有问题的;如果是小除大,则会将其转化为大除小。看实例:

  • 例1:求 48 和 18 的最大公约数48÷18=2 余 12 → 18÷12=1 余 6 → 12÷6=2 余 0 → GCD=6。
  • 例2:调换顺序求 18 和 48 的最大公约数18÷48=0 余 18 → 48÷18=2 余 12 → 后续步骤同例1 → GCD=6。
#include <iostream>
using namespace std;

int gcd(int a, int b)
{
    if(b == 0)
        return a;
    return gcd(b, a%b);
}

int main()
{
    int a = 0, b = 0;
    cin >> a >> b;
    cout << (a*b/gcd(b,a)) << endl;
    return 0;
}

全部评论

相关推荐

爱吃肉的伊登在写日记:好棒,27届简历能做成这个样子,但是第一个项目感觉cover住难度还是不小的,特别是二面的时候肯定要对分布式系统设计这一块儿有高出正常面试者的水平才行
点赞 评论 收藏
分享
海螺很能干:每次看到这种简历都没工作我就觉得离谱
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务