Least Common Multiple
Problem Description
The least common multiple (LCM) of a set of positive integers is the smallest positive integer which is divisible by all the numbers in the set. For example, the LCM of 5, 7 and 15 is 105.
Input
Input will consist of multiple problem instances. The first line of the input will contain a single integer indicating the number of problem instances. Each instance will consist of a single line of the form m n1 n2 n3 ... nm where m is the number of integers in the set and n1 ... nm are the integers. All integers will be positive and lie within the range of a 32-bit integer.
Output
For each problem instance, output a single line containing the corresponding LCM. All results will lie in the range of a 32-bit integer.
Sample Input
2 3 5 7 15 6 4 10296 936 1287 792 1
Sample Output
105 10296
#include<cstdio>
int main(){
int N;
scanf("%d",&N);
while(N--){
int n,maxn=0,f[11000],x;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&f[i]);
if(f[i]>maxn) maxn=f[i];
}
x=maxn;
bool flag=true;//能否全部整除
for(int i=0;i<n;i++)
if(maxn%f[i]!=0){//不能整除所有数
flag=false;
break;
}
while(!flag){
maxn+=x;//maxn加一倍
flag=true;//假设可以整除所有数
for(int i=0;i<n;i++)
if(maxn%f[i]!=0){//不能整除所有数
flag=false;
break;
}
}
printf("%d\n",maxn);
}
return 0;
}
//
上面是之前的算法,效率很低,测试时间499MS,看我刚写的:求多个数的最小公倍数,就是不断求两个数的最小公倍数,不断更新最小公倍数。代码如下:
#include<cstdio>
int ans;
void qiu(int x,int y){//求x,y的最小公倍数
int z=x;
while(x%y!=0)
x+=z;//还是用大的数翻倍来求最小公倍数
ans=x;
}
int main(){
int N,n;
scanf("%d",&N);
while(N--){
ans=0;
int f[10010];
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&f[i]);
if(f[i]>ans) ans=f[i];//假设最大的那个数是最小公倍数
}
for(int i=0;i<n;i++)
qiu(ans,f[i]);//不断求两个数的最小公倍数,然后更新ans
printf("%d\n",ans);
}
}
时间大大降低,效率提高,而且代码简练。