XTU OJ 1334 Least Common Multiple

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。
第二个样例,最小的公倍数为lcm(3,5,15)=15。
第一个样例,最小的公倍数为lcm(1,2,4)=4。

求任意三个数的最小公倍数要先知道俩个数的最小公倍数怎么求,对于俩个数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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值