题意
给定三个正整数,求他们三个的最小公倍数
方法一:暴力
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;
}