1. 程式人生 > >Problem C: 深入淺出學演算法004-求多個數的最小公倍數

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

能AC的程式碼

#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); } } }

不能AC的程式碼,有沒有大佬能幫忙找下錯誤

#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*b/gcd(a,b);
}


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;
}