Description | ||
Least Common Multiple题目描述一个集合,任取3个不同的元素,求其最小公倍数中最小的值是多少? 输入第一行是样例数T(1≤T≤100)。 每个样例的第一行是一个整数n(3≤n≤50),表示集合元素的个数。 每个样例的第二行是n个整数a1,a2,…,an,1≤ai≤106。 输出每个样例输出一行。 样例输入3 5 2 3 5 7 11 5 2 3 5 7 15 6 12 3 2 1 6 4 样例输出30 15 4 样例解释第一个样例,最小的公倍数为lcm(2,3,5)=30。 |
求任意三个数的最小公倍数要先知道俩个数的最小公倍数怎么求,对于俩个数a,b,a*b=最大公因数*最小公倍数,因此可以先用辗转相除法求最大公因数,然后利用a*b/gcd(最大公因数)得到最小公倍数。
然后对于这题,先读入数组,然后任选三个数的操作可以遍历来选,接着先计算俩个数的最小公倍数,再计算这个最小公倍数和另一个数的最小公倍数并记录判断是不是最小。
#include<stdio.h>
__int64 gcd(__int64 a,__int64 b)//最小公倍数等于a*b/最大公因数
{
if(a<b){
__int64 temp = a;
a = b;
b = temp;
}//使前者大
__int64 temp;
while(temp=a%b){
a = b;
b = temp;
}
return b;
}
int main()
{
int t;
scanf("%d", &t);
while(t--){
int n;
scanf("%d", &n);
__int64 a[n];
for(int i=0;i<n;i++){
scanf("%I64d", &a[i]);
//printf("%d ", a[i]);
}
//printf("\n");
__int64 ans = a[0]*a[1]*a[2];
for(int i=0;i<n-3+1;i++){//依次找三个数的最小公倍并比较;
for(int j=i+1;j<n-2+1;j++){
for(int k=j+1;k<n-1+1;k++){
__int64 d1 = a[i]*a[j]/gcd(a[i],a[j]);
__int64 d2 = d1*a[k]/gcd(d1,a[k]);
if(d2<ans)ans = d2;
}
}
}
printf("%I64d\n", ans);
}
return 0;
}