多个数据的最小公倍数

有一种求最小公倍数算分就是先求出所有项的积M,然后M除以每项的到新数列,求出新数列的最大公约数N,最小公倍数就是M/N;

#include <stdio.h>
#include <algorithm>
int a[100011];
int b[100011];
int main()
{
     int i,j,n,m,k,sum;
     while(scanf("%d",&n)!=EOF)
     {
         sum=1;
          memset(a,0,sizeof(a));
          memset(b,0,sizeof(b));
           for(i=0;i<n;i++)
            {
                 scanf("%d",&a[i]);
                 sum*=a[i];
            }
           for(i=0;i<n;i++)
            {
                k=a[i];
                 a[i]=sum/k;
            }
         for(i=0;i<n;i++)
          {
                 for(j=1;j*j<=a[i];j++)
                    {
                         if(a[i]%j==0)
                         {
                            if(a[i]==j*j) b[j]++;
                         else{
                                  b[j]++;
                                   b[a[i]/j]++;
                                }
                         }
                   }
          }
            for(i=100011;i>0;i--)
              {
                    if(b[i]==n)
                      {
                          m=i;break;
                      }
                }
             printf("%d\n",sum/m);
 }
return 0;
}

提交显示是运行错误,是数据越界,题目要求的是32位整数,32位就是4个字节,有int 、long型,当输入数据过大时,求出所有数的乘积肯定会越界,所有要换一种算法;

#include <stdio.h>
int c(int x,int y)
{
    int temp,t,a,b;
    if(x<y)
    {
        t=x;
        x=y;
        y=t;
    }
    a=x;b=y;
    temp=x%y;
    while(temp!=0)
    {

        x=y;
        y=temp;
        temp = x%y;
    }
    return a*(b/y);//用括号是防止a*b的值越界
}
int main()
{
    int i,n,m,a[100024];
    while(scanf("%d",&n)!=EOF)
    {
        for(i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
        }
        for(i=1;i<n;i++)
        {
            m=c(a[i-1],a[i]);
            a[i]=m;
        }
        printf("%d\n",m);
    }
    return 0;
}

此算法的思想是,先求出第一个和第二个的最小公倍数,在用这个最小公倍数与第三个求出最小公倍数,以此类推;
当然,为了代码简介点,可以在输入时,就开始求,不必要先把输入数据储存;

还有一个算法
#include<stdio.h>
int main()
{
    int i,n,s[500],a;
    while(scanf("%d",&n)!=EOF)

    {
        a=0;
        for(i=1;i<=n;i++)
        {
            scanf("%d",&s[i]);
            if(a<s[i])  a=s[i];
        }
        for(i=1;i<=n;i++)
        {
          if(a%s[i]!=0)
          {
              a++;
              i=0;
          }
        }
        printf("%d\n",a);

    }
    return 0;

}
就是从最大值开始加,一直到,这个值能整除所有的数,那么就是最小公倍数;


posted on 2015-05-08 17:04  l-m  阅读(246)  评论(0编辑  收藏  举报