1. 程式人生 > >HDU1019 Least Common Multiple

HDU1019 Least Common Multiple

在這裡插入圖片描述

在這裡插入圖片描述

思路:外層迴圈控制問題數,內層讀入輸入計算最小公倍數

求最小公倍數=兩數的乘積/最大公約數

錯誤。。。

#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先除掉最大公約數,在乘。