HDU 2028 如何计算最小公倍数?

题目 http://acm.hdu.edu.cn/showproblem.php?pid=2028

方法一:先用辗转相除法,两个两个一组求出最大公约数,再求最小公倍数。。。

View Code

方法二:参见Matrix67的博客,http://www.matrix67.com/blog/archives/554

            趣题:不用除法,如何求n个数的最小公倍数

我的代码

View Code
#include<stdio.h>
#include<string.h>
int judge(int *a,int n)
{
    int i,j,flag=0;
    for(i=1;i<n;i++)
    for(j=i+1;j<=n;j++)
    {
       if(a[i]!=a[j])
       {flag=1;
        break;
       }
    }
    if(flag==1)
    return 0;
    else
    return 1;



}
void fun(int *a,int *b,int n)
{
    int min=10000000,i,mini;
    for(i=1;i<=n;i++)
    {
        if(a[i]<min)
       {min=a[i];
        mini=i;
       }
    }
    a[mini]=a[mini]+b[mini];
}
int a[1000],b[1000];
int main()
{
    int n,i,flag1;

    while(scanf("%d",&n)!=EOF)
    {
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));

        flag1=1;
        for(i=1;i<=n;i++)
        scanf("%d",&a[i]);
        for(i=1;i<=n;i++)
        b[i]=a[i];
        while(flag1)
        {
        if(judge(a,n))
        {printf("%d\n",a[1]);
         flag1=0;
        }
        else
        fun(a,b,n);
        }



    }
    return 0;
}

但是过不了OJ,这个复杂度有点高,数稍微多一点点就不行了,暂时不知道怎么修改,存在这里吧。

方法三:暴力求解

View Code
#include<stdio.h>
int main()
{
    int a[1000],T,i,j,k;
    while((scanf("%d",&T))!=EOF)
    {
        for(i=0;i<T;i++)
        {
            scanf("%d",&a[i]);
        }
        for(i=a[0];;)
        {
            for(j=0;j<T;)
            {
                if(i%a[j]==0)
                {
                    j++;
                }
                else
                {
                    i++;
                    j=0;
                }
            }
            printf("%d\n",i);
            break;
        }
    }
    return 0;
}

这个与方法二在思路上有点类似。

原文地址:https://www.cnblogs.com/whatthefy/p/2996362.html