题目 http://acm.hdu.edu.cn/showproblem.php?pid=2028
方法一:先用辗转相除法,两个两个一组求出最大公约数,再求最小公倍数。。。
View Code
方法二:参见Matrix67的博客,http://www.matrix67.com/blog/archives/554
我的代码
View Code
#include<stdio.h> #include<string.h> int judge(int *a,int n) { int i,j,flag=0; for(i=1;i<n;i++) for(j=i+1;j<=n;j++) { if(a[i]!=a[j]) {flag=1; break; } } if(flag==1) return 0; else return 1; } void fun(int *a,int *b,int n) { int min=10000000,i,mini; for(i=1;i<=n;i++) { if(a[i]<min) {min=a[i]; mini=i; } } a[mini]=a[mini]+b[mini]; } int a[1000],b[1000]; int main() { int n,i,flag1; while(scanf("%d",&n)!=EOF) { memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); flag1=1; for(i=1;i<=n;i++) scanf("%d",&a[i]); for(i=1;i<=n;i++) b[i]=a[i]; while(flag1) { if(judge(a,n)) {printf("%d\n",a[1]); flag1=0; } else fun(a,b,n); } } return 0; }
但是过不了OJ,这个复杂度有点高,数稍微多一点点就不行了,暂时不知道怎么修改,存在这里吧。
方法三:暴力求解
View Code
#include<stdio.h> int main() { int a[1000],T,i,j,k; while((scanf("%d",&T))!=EOF) { for(i=0;i<T;i++) { scanf("%d",&a[i]); } for(i=a[0];;) { for(j=0;j<T;) { if(i%a[j]==0) { j++; } else { i++; j=0; } } printf("%d\n",i); break; } } return 0; }
这个与方法二在思路上有点类似。