求n个数的最小公倍数。
Input
输入包含多个测试实例,每个测试实例的开始是一个正整数n,然后是n个正整数。
Output
为每组测试数据输出它们的最小公倍数,每个测试实例的输出占一行。你可以假设最后的输出是一个32位的整数。
Sample Input
2 4 6
3 2 5 7
Sample Output
12
70
#include<stdio.h>
#include<string.h>
int gcd(int a, int b)
{
int c;
if(b == 0)
return a;
while(b)
{
c = a;
a = b;
b = c % b;
}
return a;
}
int main()
{
int n, i, max = -1, maxsign, j, f;
int a[500];
while(scanf("%d", &n) != EOF)
{
for(i = 0; i < n; i++)
scanf("%d", &a[i]);
if(n == 1)
{
printf("%d\n", a[0]);
continue;
}
f = a[0];
for(i = 1;i < n; i++)//不要写成“<=”n个数只要求n-1次最小公倍数。
f = (f/gcd(f, a[i]))*a[i];
printf("%d\n", f);
}
return 0;
}
最大公约数:greatest common divisor
最小公倍数:lowest common multiple
公式::x*y = gcd lcm
即:lcm = xy/gcd
gcd求法:辗转相除法。
另外再附上求最小公倍数的的两个博主的链接:
链接1
下面是我用枚举思想写的AC代码:
思想是:找到输入的数中的最大数。对该最大数进行倍数扩大,最大数倍数扩大的同时对该列数中除最大数以外的所有数取余,如果能对这些数都取余为0,即此时最大数的倍数即为该组数的最小公倍数。
但是,
学长说:给你两个数一个100000007(一亿零7),一个100000009(一亿零9)。两个极大的质数。
最大的是100000009,那么得对100000009扩增100000007次才能找到这两个数的最小公倍数。
这样很容易 Time Limit Exceeded 的。
他还建议我打ACM尽量用long long 来定义。大多数情况是用很大数据来测试的。
#include<stdio.h>
#include<string.h>
#include <algorithm>
int main()
{
int n, i, max = -1, maxsign, j;
int a[500];
while(scanf("%d", &n) != EOF)
{
max = -1;//max每次又没初始化。
for(i = 0; i < n; i++)
{
scanf("%d", &a[i]);
if(a[i] > max)
{
max = a[i];
maxsign = i;
}
}
if(n == 1)
{
printf("%d\n", a[0]);
continue;
}
for(j = 1; ; j++)//学长说这是暴力枚举,如果数据很大会超时。
{
for(i = 0; i < n; i++)
{
if( ((max*j) % a[i]) != 0)
break;
if(i == maxsign)
continue;
}
if(i == n)
{
printf("%d\n", max*j);
break;
}
}
}
return 0;
}