刚刚写完这题,简单分享一下。
看到题目的第一瞬间,懂了求三个数的最小公倍数,直接暴力模拟。
#include <iostream>
using namespace std;
typedef long long ll;
ll a,b,c;
ll gcd(ll a,ll b)
{
ll q=max(a,b);
for(ll i=q; i<=a*b; i++)
if(i%a==0 && i%b==0) return i;
}
int main()
{
cin >>a>>b>>c;
ll d=gcd(a,b);
ll dd=gcd(c,d);
cout<<dd<<endl;
return 0;
}
测试了一下样例,嗯,不出所料,没能ac,80分。
然后就是思考问题的所在,发现这样的话数据会爆掉,1e5就爆了,没法达到题目要求的1e8,那么接下来就是缩小数据,点开了标签,发现了gcd。,那么下面的就是用gcd写的·,求两个数的最小公倍数,那么就是两个数的乘积再除以最大公约数即可,这样我们就缩小了数据范围,能够满足题目要求的1e8。(ac代码,可放心使用,有问题,评论区交流)
#include <iostream>
using namespace std;
typedef long long ll;
ll a,b,c;
ll gcd(ll a,ll b)
{
if(a%b==0) return b;
else return gcd(b,a%b);
}
int main()
{
cin >>a>>b>>c;
ll d=gcd(a,b); //d是a和b的最大公约数
d = a*b/d;
ll dd=gcd(c,d); //dd是d和c的最大公约数
dd = d*c/dd;
cout<<dd<<endl;
return 0;
}