需要注意的是,虽然最后输出为32位整数,但是a*b可能会超出int范围(最小公倍数=a*b/a和b最大公约数)

在此提供两个写法都可以AC:


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <stdio.h>
int gcd(int a,int b)
{
    int temp;
    if(a<b)
    {
        temp=a;
        a=b;
        b=temp;
    }
    if(b==0) return a;
    else return gcd(b,a%b);
}
int main()
{
    int n,s;
    long long t,k;
    int i;
    while(scanf("%d",&n)!=EOF)
    {
        t=0;
        k=1;
        for(i=1;i<=n;i++)
        {
            scanf("%d",&s);
            t=s*k/gcd(s,k);//s*k可能超出int范围 
            k=t;        
        }
        printf("%lld\n",t);
    }
    return 0;
}

第二个就是把计算顺序改下,先除再乘,即a*b/c==b/c*a,计算最大公约数的方法相同就不写了

1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
int main()
{
    int n,s;
    int t,k;
    int i;
    while(scanf("%d",&n)!=EOF)
    {
        t=0;
        k=1;
        for(i=1;i<=n;i++)
        {
            scanf("%d",&s);
            t=k/gcd(s,k)*s;
            k=t;        
        }
        printf("%d\n",t);
    }
    return 0;
}