题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1019
题面:
翻译:
问题描述
一组正整数的最小公倍数(LCM)是一组正整数中可以被所有数整除的最小的正整数。例如,5、7和15的LCM是105。
输入
输入将由多个问题实例组成。输入的第一行将包含一个整数,该整数指示问题实例的数量。每个实例将由m n1 n2 n3…其中m是集合中整数的个数,n1…nm是整数。所有整数都是正的,并且位于一个32位整数的范围内。
输出
对于每个问题实例,输出一行包含相应的LCM。所有结果的范围都是32位整数。
样例输入
2
3 5 7 15
6 4 10296 936 1287 792 1
样例输出
105
10296
思路:
这道题目的就是问你求n个数字的最小公倍数,那我们可以先求两个数的最小公倍数然后再把这两个数的最小公倍数与另一个数字求最小公倍数,依次求下去,最后就可以求n个数字的最小公倍数,这里我们需要了解的就是最小公倍数的求法,求最小公倍数我们就需要把最大公约数求出来,最大公约数的求法就是常见的辗转相除法,这里就不展开讲了,求最大公约数和最小公倍数的函数在下面,可以参考参考,作为模板。
参考代码:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<vector>
#include<list>
#include<stacK>
#include<queue>
#include<map>
#include<set>
using namespace std;
typedef long long ll;
int gcd(int a,int b)//求a和b的最大公约数
{
return b==0?a:gcd(b,a%b);
}
int lcd(int a,int b)//求a和b的最小公倍数
{
return a/gcd(a,b)*b;
}
int main()
{
int t;
cin>>t;
while(t--)
{
int n,a,b;
cin>>n;
cin>>a;//先输入一个数字
for(int i=1;i<n;i++)
{
cin>>b;
a=lcd(a,b);//然后每次都是前两个数字的最小公倍数与第三个数字的找最小公倍数
}
cout<<a<<endl;
}
}