題目描述
求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。