Least Common Multiple
2 3 5 7 15 6 4 10296 936 1287 792 1
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); } }