题目描述:
Problem Description
求n个数的最小公倍数。
Input
输入包含多个测试实例,每个测试实例的开始是一个正整数n,然后是n个正整数。
Output
为每组测试数据输出它们的最小公倍数,每个测试实例的输出占一行。你可以假设最后的输出是一个32位的整数。
Sample Input
2 4 6
3 2 5 7
Sample Output
12
70
思路:
两个数的最小公倍数,等于两个数的乘积,除以这两个数的最大公因数。
两个数的最大公因数可以用辗转相除法求得。
此题的解法是,首先求得前两个数的最小公倍数,然后求该数与下一个数的最小公倍数,以此类推,最终得到整个数列的最小公倍数。
实现(C++):
#include <iostream>
using namespace std;
int max(int n1, int n2){ //比较两个整数,取最大值
if(n1>=n2) return n1;
else return n2;
}
int min(int n1, int n2){ //比较两个整数,取最小值
if(n1>=n2) return n2;
else return n1;
}
int main(){
int N;
while(cin>>N){
int nums[10001];
for(int i=0; i<N; i++)
cin>>nums[i];
int n1=max(nums[0], nums[1]);
int m1=min(nums[0], nums[1]);
int _n1=n1;
int _m1=m1;
while(_m1!=0){ //辗转相除法,计算前两个数的最大公因数
int temp=_m1;
_m1=_n1%_m1;
_n1=temp;
}
int n_m = n1 / _n1 * m1 ; //计算前两个数的最小公倍数,先相除后相乘
for(int i=1; i<N; i++){ //计算整个数列的最小公倍数
int n=max(nums[i], n_m);
int m=min(nums[i], n_m);
int _n=n;
int _m=m;
while(_m!=0){
int temp=_m;
_m=_n%_m;
_n=temp;
}
n_m = n / _n * m ;
}
cout<<n_m<<endl;
}
return 1;
}