还是最小公倍数 HDU

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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值