#include<stdlib.h> #include<stdio.h> int *data; int main() { void lcm(int n); int m; int n; int i; scanf("%d",&m); while(m--) { scanf("%d",&n); data=(int *)malloc(sizeof(int)*(n+1)); for(i=0;i<n;i++) scanf("%d",&data[i]); lcm(n); free(data); } } void lcm(int n) //求n个数的最小公倍数 { int gcd ( int a,int b ); int i,j; int tem; int now=data[0]; for(i=1;i<n;i++) { tem=gcd(now,data[i]); now=now/tem*data[i]; } printf("%d ",now); } int gcd ( int a,int b ) //求两个数的最大公约数 { int temp; if (a<b) { temp=a; a=b; b=temp; } if ( a % b == 0) return b; else return gcd ( b,a % b) ; }
链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1797
求多个数的最小公倍数。现在我们对于两个数,他们的最小公倍数和最大公约数有如下关系:
设两个数是a,b最大公约数是p,最小公倍数是q
那么有这样的关系:ab=pq
而最大公约数可以用辗转相除发求。
解题思路是这样的:先求前两个数的最小公倍数q,再求q与第三个数的最小公倍数,覆盖掉原来的q值,,,,,依次下去.................
#include<stdlib.h> #include<stdio.h> int *data; int main() { void lcm(int n); int m; int n; int i; scanf("%d",&m); while(m--) { scanf("%d",&n); data=(int *)malloc(sizeof(int)*(n+1)); for(i=0;i<n;i++) scanf("%d",&data[i]); lcm(n); free(data); } } void lcm(int n) //求n个数的最小公倍数 { int gcd ( int a,int b ); int i,j; int tem; int now=data[0]; for(i=1;i<n;i++) { tem=gcd(now,data[i]); now=now/tem*data[i]; } printf("%d ",now); } int gcd ( int a,int b ) //求两个数的最大公约数 { int temp; if (a<b) { temp=a; a=b; b=temp; } if ( a % b == 0) return b; else return gcd ( b,a % b) ; }