【刷题笔记】求最小公倍数

题目:

牛客网链接求最小公倍数_牛客题霸_牛客网

描述

        正整数A和正整数B 的最小公倍数是指 能被A和B整除的最小的正整数值,设计一个算法,求输入A和B的最小公倍数。

数据范围:1≤a,b≤100000 

输入描述

        输入两个正整数A和B。

输出描述

        输出A和B的最小公倍数。

示例1

输入:5 7

输出:35

示例2

输入:2 4

输出:4

解析:

        首先需要理解最小公倍数的含义。公倍数,也就是能够同时被两个数整除。最小就是最小的那个数。

法1.

        求解最简单粗暴的方式就是从最大的那个数开始,往上递增,直到存在被两个数整除的时候就是对应的最小公倍数了。另外,对于增长我们不可简单的++,那样效率很低下,我们可以将最大数按照其倍数进行增长,这样效率就会提高。

法2.

        当然,其实最大公约数(两个数能同时整除的最大数)的辗转相除法效率很高,并且最小公倍数和最大公约数的乘积就是对应两个数的乘积。所以我们可以利用辗转相除法先求得最大公约数即可求解。

        辗转相除法就是最大数除以最小数。如果能够被整除,那么较小的那个数就是最大公约数,如果不能,较小数赋值给较大数,余数赋值给较小数,重复上述过程,直到能被整除就可以找到最大公约数了。

解答:

#include <iostream>
using namespace std;

int greatCD(int a, int b)
{
    // 辗转相除法求解最大公约数
    if (a < b) swap(a, b);
    while (a % b)
    {
        int tmp = a % b;
        a = b;
        b = tmp;
    }
    return b;
}

int main()
{
    // 法2. 利用辗转相除法快速求解最大公约数,然后求解最小公倍数
    int a, b;
    while (cin >> a >> b)
    {
        cout << (a * b) / greatCD(a, b) << endl;
    }

    // 法1,最大值成倍增长,直到可被原本两数都整除为止
    // int a, b;
    // while (cin >> a >> b)
    // {
    //     int max_val = max(a, b);
    //     int res = max_val;
    //     int count = 2;
    //     while ((res % a != 0) || (res % b != 0))
    //     {
    //         res = max_val * count;
    //         count++;
    //     }
    //     cout << res << endl;
    // }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_61508423/article/details/130607049