奋战杭电ACM(DAY12)1019

这道题不难,但是很考验基本功。我基本功不扎实,所以还是栽了跟头……敲打

一开始用大数翻倍法求LCM,结果很显然……TLE……

后来改进了,用GCD求LCM,但是循环时漏了递减计数,一直死循环……还是TLE……

后来好不容易改过来了,结果……WA了……

忘了32-bit下溢出问题……求解最小公倍数时,先乘后除,乘法明显可能溢出……

然后是数组大小,没有考虑大小为1 的情况,下标可能越界……

总而言之,这水题还是暴露了我很多细节问题,以后一定要注意!奋斗

Least Common Multiple

#include <iostream>
using namespace std;

int gcd(int a ,int b)
{
	int temp;
	if(a<b)
	{
		temp=a;
		a=b;
		b=temp;
	}
	if(a%b==0)
		return b;
	else 
		return gcd(a%b,b);
}

int lcm(int a, int b)
{
	return a/gcd(a,b)*b;//原来写a*b/gcd(a,b),一直WA……因a*b可能会溢出……
}


int main()
{
	int n,m,LCM;
	cin >> n;
	while(n>=1)
	{
		cin >> m;
		int *p= new int[m];
		for(int i=0; i<m; i++)
			cin >> p[i];
		LCM=p[0];
		if(m>1)//可能只有一个数……
		{
			for(i=1; i<m; i++)
				LCM=lcm(LCM,p[i]);}
		cout << LCM << endl;
		n--;//一开始忘了……TLE……
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值