Problem Description
2个正整数的最小公倍数,大家应该都知道怎么求了,比如,10和14的最小公倍数就是70。
现在增加点难度,如果给你多个正整数,你还会计算最小公倍数吗?
比如,5、7、15这三个数的最小公倍数就是105.
Input
输入数据第一行是一个正整数C(C<10),表示有C组测试用例。
接下来C行,每行是一组测试数据。
每组数据首先是一个正整数N(1<N<30),表示本组数据有N个正整数,然后接着是N个正整数。
Output
请输出每组数据的最小公倍数,每组数据输出一行。
题目保证所有的结果都在32位整数范围内。
Sample Input
2
3 5 7 15
6 4 10296 936 1287 792 1
Sample Output
105
10296
这个题,最一开始的时候我想着我可以逐个枚举最小公倍数,这种枚举也可以解决问题,但是只适合处理数据较小的数字,而像题中结果都在32位整数范围内,并且最多处理30个整数的最小公倍数,这样的作法妥妥的会超时
(最传统的方法是在m<n的情况下从m开始到nm结束变化长度为1进行逐个枚举,改进的方法是从m开始到nm结束变化长度为m进行逐个枚举,毕竟最小公倍数是n的倍数同时也是m的倍数),这两个方法都会造成超时。
我们这个时候就要使用
这个公式去完成任务,其中LCM是最小公倍数,GCD是最大公约数,求GCD我们都知道使用最省时间的辗转相除法,但是使用这个公式我们注意这个A*B对于大数会很容易爆int的所以要不我们声明一个longlong,要不我们就把/GCD挪到前面来,先除再乘就可以防止数据爆掉。
我感觉写完这个题我可真是学到太多了,之前都不知道这个公式,也不知道在写题过程中数据越界的危险,往往一次写不对,要提交好多次才通过,这样的错误在蓝桥杯中真的是很可怕的了,毕竟通过测试样例的你以为自己已经对了,但实际上只能通过几组样例。
这个gcd函数不用在while循环之前不用保证a>b,因为如果a<b的话,在while循环里第一次循环后就换过来了。
最后上代码
#include<iostream>
#include<algorithm>
using namespace std;
int gcd(int a,int b)
{
while(b!=0)
{
int t=a%b;
a=b;
b=t;
}
return a;
}
int main()
{
int c;
while(cin>>c)
{
while(c--)
{
int n,q;
cin>>n;
int iend=1;
cin>>q;
iend=q;
int ex;
for(int i=1;i<n;i++)
{
cin>>q;
ex=gcd(iend,q);
iend=iend/ex*q;
}
cout<<iend<<endl;
}
}
return 0;
}