HDU1019 Least Common Multiple
阿新 • • 發佈:2018-12-14
思路:外層迴圈控制問題數,內層讀入輸入計算最小公倍數
求最小公倍數=兩數的乘積/最大公約數
錯誤。。。
#include <iostream>
using namespace std;
int LeastNum(int a, int b)
{
int c = 0;
int m = a; //儲存a,b的值
int n = b;
while(b != 0)
{
c = a%b;
a = b;
b = c;
}
return m*n/a;
}
int main() {
int cnt = 0;
cin >> cnt;
while(cnt--)
{
int m;
cin >> m;
int a[m];
for(int i=0; i<m; i++)
{
cin >> a[i];
}
int result = LeastNum(a[0], a[1]);
for(int i=2; i<m; i++)
{
int current = LeastNum(result, a[i]);
if(result < current)
{
result = current;
}
}
cout << result << endl;
}
return 0;
}
仍然WA,以為是沒有考慮到特殊的邊界情況,還加了幾種特殊情況的限定,仍然沒有用。。。
#include <iostream>
using namespace std;
int LeastNum(int a, int b)
{
int c = 0;
int m = a; //儲存a,b的值
int n = b;
while(b != 0)
{
c = a%b;
a = b;
b = c;
}
return m/a*n;
}
int main() {
int cnt = 0;
cin >> cnt;
while(cnt--)
{
int m;
cin >> m;
int a[m] = {0};
for(int i=0; i<m; i++)
{
cin >> a[i];
}
int result = a[0];
for(int i=1; i<m; i++)
{
result = LeastNum(result, a[i]);
}
cout << result << endl;
}
return 0;
}
其實整體思路一直沒問題,關鍵是求最小公倍數的時候可能會溢位,故應該先除後乘。
也就是題目中雖然明確指出沒有超過int的範圍,但是運算過程中可能會超過int的範圍,真的是坑,即m*n/a
改為m/a*n
先除掉最大公約數,在乘。