LETTers比赛第三场 1001 Least Common Multiple 解题报告

提交人:侯建鹏

提交日期:2012/4/16

1001 Least Common Multiple

  这道题求解的是几个数的最小公倍数,我的想法是先求前两个数的最小公倍数,再求的得到的这个数和第三个数的最小公倍数,以此类推。

求解两个数a和b的最小公倍数d的方法:

1、  用辗转相除法求出这两个数的最大公约数,记为c。

2、  则最小公倍数d=(a/c)*b。

特别注意的问题:为什么d=(a/c)*b而不是d=(a*b)/c?

  因为a和b都是32bit的数字,如果先执行a*b很可能会超出32bit的存储范围而发生错误,所以先除再乘。(当然,如果你用的是__int64,可以忽略这个问题)

#include<stdio.h>

int number[1010];

int MD(int a , int b )
{
    int r=a%b;
    while(r)
    {
        a=b;
        b=r;
        r=a%b;
    }
    return b;
}

int main()
{
    //freopen("input.txt","r",stdin);
    int cas,num,md,i;
    scanf("%d",&cas);
    while(cas--)
    {
        scanf("%d",&num);
        for(i=0;i<num;i++)
        {
            scanf("%d",&number[i]);
            if(i!=0)
            {
                md=MD(number[i-1],number[i]);
                number[i]=number[i-1]/md*number[i];
            }
        }
        printf("%d\n",number[num-1]);
    }
    return 0;
}

 

原文地址:https://www.cnblogs.com/LETTers/p/2452696.html