HDOJ 2028 Lowest Common Multiple Plus
Problem Description
求n个数的最小公倍数。
Input
输入包含多个测试实例,每个测试实例的开始是一个正整数n,然后是n个正整数。
Output
为每组测试数据输出它们的最小公倍数,每个测试实例的输出占一行。你可以假设最后的输出是一个32位的整数。
Sample Input
2 4 6
3 2 5 7
Sample Output
12
70
#include <stdio.h>
int lcm(int x, int y);
int main(void)
{
int n, i;
int t;
while (scanf("%d", &n) != EOF)
{
/*1与任何数字的最小公倍数都是那个数本身
所以初始化为1不会影响最终结果假定第一个输入的数字与1求最小公倍数*/
int x = 1;
for (i = 1; i <= n; i++)
{
scanf("%d", &t);
x = lcm(x, t);
}
printf("%d\n", x);
}
return 0;
}
int lcm(int x, int y)
{
int r;
int a = x, b = y;
//辗转相除法求最大公约数
while (y > 0)
{
r = x % y;
x = y;
y = r;
}
//最小公倍数 = x * y / gcd(x,y)
//x * y有可能溢出, x / gcd(x,y) * y能有效避免
return a / x * b;
}