求N個數的最小公倍數

題目描述

求n(n <= 50)個數的最小公倍數。

輸入

輸入包含多個測試實例,每個測試實例的開始是一個正整數n,然後是n個正整數。

輸出

爲每組測試數據輸出它們的最小公倍數,每個測試實例的輸出佔一行。你可以假設最後的輸出是一個32位的整數。

樣例輸入

2 4 6
3 2 5 7

樣例輸出

12
70

在數學上,我們求幾個數的最小公倍數的方法是對他們分解質因數,然後將他們的質因數相乘,如果有相同的質因數則乘的時候乘該共有質因數的最高次冪項,這種方法顯然不適合寫程序解題,我們考慮另一種方法。公式法,有這樣一個公式:x*y = gcd *lcm,即是x y爲要求最小公倍數的兩個數,lcm代表最小公倍數,gcd代表最大公約數。將公式變形可得lcm = x*y/gcd,我們就可以利用這個公式求lcm。

求gcd的方法很多,可以手寫一個函數gcd()利用輾轉相除法求,由於這裏是解題,我們可以直接使用G++編譯器自帶的 __gcd(int,int)函數來求,返回值即是這兩個數的最大公約數,使用時需要包含頭文件#include<algorithm>,這是c++的頭文件,另外,這個函數在devc++裏可用,code::blocks應該也可用,但是vs裏是用不了這個函數的,請自行實現一個。

那麼我們理一下寫程序的思路,首先我們要用一個數組儲存要求的幾個數,然後寫個函數循環求gcd,這裏我曾犯了一個錯,我把求lcm和gcd的過程分開了,就是先對這n個數求lcm,然後統一求gcd,這是錯誤的。正確的做法是,假如傳進來n個數a b c d e....,我們應該先對a b求lcm然後求a b的gcd,再用這個結果(a b的gcd)和c一起求gcd,再用結果和d一起求gcd,以此類推。如果擔心溢出問題可以將公式調整一下求值順序,lcm = x/gcd*y,對這題而言多此一舉,題目已經說明結果爲32位整數。

下面是我的題解代碼:

#include <cstdio>
#include <algorithm>

using namespace std;

int main(){

	int n,a;
	while(scanf("%d",&n) != EOF){
		int arr[n];
		for(int i=0;i<n;i++){
			scanf("%d",&arr[i]);
		}
		a = arr[0];
		if(n == 1){
			printf("%d\n",a);
			continue;
		}
		for(int i=1;i<n;i++){
			a = a/__gcd(a,arr[i])*arr[i];
		}
		printf("%d\n",a);
		
	}

	
	return 0;
}

這份代碼提交OJ已AC。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章