#include <stdio.h>
int gcd(int a, int b) //辗转相除法求得最大公约数
{
if(a == 0)
return b;
else
return gcd(b % a, a);
}
int Sort(int a[], int n) //冒泡排序
{
for(int i = 0; i < n - 1; i++)
{
for(int j = n - 1; j >= 1; j--) {
if(a[j] < a[j - 1]) {
int tmp = a[j];
a[j] = a[j - 1];
a[j - 1] = tmp;
}
}
}
}
int main()
{
int a[10000];
int n;
while(scanf("%d", &n) != EOF) {
for(int i = 0; i < n; i++)
scanf("%d", &a[i]);
Sort(a, n);
// for(int i = 0; i < n; i++)
// printf("%d", a[i]);
int k = gcd(a[0], a[1]);
int l = a[0]*a[1];
int t = l / k;
for(int i = 2; i < n; i++) {
k = gcd(t, a[i]);
t = t/k*a[i];
}
printf("%d\n", t);
}
return 0;
}
总结
最小公倍数 lcs
最大公约数 gcd
g c d ( a , b ) = { b , if a = 0 g c d ( b % a , a ) , if a != 0 gcd(a, b) = \begin{cases} b, & \text{if $a$ = 0} \\ gcd(b\%a, a), & \text{if $a$ != 0} \end{cases} gcd(a,b)={b,gcd(b%a,a),if a = 0if a != 0
lcs = a*b/gcd;
Tip
本题的数据较大,a和b可能是32位的数字,如果先a*b,则可能发生溢出。
为了避免溢出,先除后乘。
最大公约数算法还有很多,请跳转到最小公倍数算法分析学习