Problem C: 深入浅出学算法004-求多个数的最小公倍数

Description

求n个整数的最小公倍数

Input

多组测试数据,先输入整数T表示组数 然后每行先输入1个整数n,后面输入n个整数k1 k2...kn

Output

求k1 k2 ...kn的最小公倍数

Sample Input

1
3 12 18 6

Sample Output

36
#include<stdio.h>
 int gcd(int x,int y)
    {
        int t=1;
        while(t!=0)
        {
            t=x%y;
            x=y;
            y=t;
        }
        return x;
    }
int lcm(int s[],int n)  
    {
        int num,i;
        for(i=0;i<n-1;i++)
        {
            num=gcd(s[i],s[i+1]);
            s[i+1]=s[i]/num*s[i+1]/num*num;
        }
        return s[n-1];
    } 
int main()
{
    int t,n,m,i;
    while(scanf("%d",&t)!=EOF)
    {
        while(t--)
        {
            scanf("%d",&n);
            int s[n];
            for(i=0;i<n;i++)
            {
                scanf("%d",&s[i]);
            }
            m=lcm(s,n);
            printf("%d\n",m);
        }
    }
}
#include <stdio.h>
/* 欧几里得算法求 数字 a b 的最大公约数 */
int gcd(int a,int b)
{
    if(a<b)
    {
        return gcd(b,a);
    }
    else if(b==0)
    {
        return a;
    }
    else
    {
        return gcd(b,a%b);
    }
}



/* 数字 a b 的最小公约数 */
int lcm(int a,int b)
{
    return a/gcd(a,b)*b;  //需要先除再乘,不然int会崩溃
}


int main()
{
int n,i,r,t;
int data[n];
while(scanf("%d",&t)!=EOF)
{
    while(t--)
    {
        scanf("%d",&n);
        for(i=0;i<n;i++)
        {
            scanf("%d",&data[i]);
        }
        // 特殊处理只有一个数字的情况
        if(n==1)
        {
        r = data[0];
        }
        else
        {
        // 先求前两个数字的最小公倍数
        r = lcm(data[0],data[1]);
        // 求第 i 个数字和前面所有数字的最小公倍数
        for(i=2;i<n;i++)
        {
            r = lcm(r,data[i]);
        }
        }
        printf("%d\n",r);
    }
}
return 0;
}

 

posted @ 2018-12-24 16:02  MichaelCecil  阅读(1662)  评论(0编辑  收藏  举报