题意

给定三个正整数,求他们三个的最小公倍数

方法一:暴力

using namespace std;
int main()
{
    long long a,b,c;
    cin >> a >> b >> c;
    long long i=1;
    for(;i<100000+1;i++)
    {
        if(i % a == 0 && i % b == 0 && i % c == 0)
        {
            cout << i << endl;
            break;
        }
    }
    return 0;
}

当数据很大的时候,暴力解法超时 不能通过所有的案例.

方法二

考虑使用《九章算术》的更相减损术: 第一步:任意给定两个正整数;判断它们是否都是偶数。若是,则用2约简;若不是则执行第二步。

第二步:以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到所得的减数和差相等为止。

则第一步中约掉的若干个2的积与第二步中等数的乘积就是所求的最大公约数。

其中所说的“等数”,就是公约数。求“等数”的办法是“更相减损”法。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll solve(ll a,ll b){
    ll k1 = a , k2 = b;
    
    while(a != b){
        if(a > b) 
            a -= b;
        else
            b -= a;
    }
    return k1 * k2 / a;
}
int main(){
    ll a[3];
    cin >> a[0] >> a[1] >> a[2];
   cout << solve(solve(a[0],a[1]),a[2]) ;
    return 0;
}