1. 程式人生 > >奮戰杭電ACM(DAY12)1019

奮戰杭電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;
}