#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\n",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\n",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) ;
}