奮戰杭電ACM(DAY12)1019
阿新 • • 發佈:2019-02-01
這道題不難,但是很考驗基本功。我基本功不紮實,所以還是栽了跟頭……
一開始用大數翻倍法求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; }