美文网首页
杭电ACM-2028

杭电ACM-2028

作者: 1QzUPm_09F | 来源:发表于2017-01-23 15:28 被阅读0次

题目:

2028题

错误代码:

错误代码!!!
#include<stdio.h>
int gcd(int x,int y)//求2个数的最大公约数
{
    if(y==0) return x;//x即为最大公约数
    else return gcd(y,x%y);
}
int main()
{
    int a,b,n,i;//n为总的数字个数,a为第一个数,b为后面输入的数字
    long long sum;
    while(~scanf("%d",&n))
    {
        scanf("%d",&a);//先将第一个数输入进去
        sum=a;
        for(i=1;i<n;i++)
        {
            scanf("%d",&b);
            a=gcd(a,b);//找出a,b中的最大公约数
            sum=sum/a*b;//sum为a,b的最小公倍数 先除法再乘法是为了防止溢出
        }
        printf("%lld\n",sum);
    }
    return 0;
}

所以为什么错误呢???

错误原因:sum为前面数的最小公倍数,第二次求最大公约数的时候不应该用前面的最大公约数和后面的数求最大公约数,而是应该用前面的最小公倍数与后面的数求最大公约数(很绕吧 ๑•ᴗ•๑)

正确代码:

#include<stdio.h>
int gcd(int x,int y)//求2个数的最大公约数
{
    if(y==0) return x;//x即为最大公约数
    else return gcd(y,x%y);
}
int main()
{
    int a,b,n,i;//n为总的数字个数,a为第一个数,b为后面输入的数字
    while(~scanf("%d",&n))
    {
        scanf("%d",&a);//先将第一个数输入进去
        for(i=1;i<n;i++)
        {
            scanf("%d",&b);
            a=a/gcd(a,b)*b;
        }
        printf("%d\n",a);
    }
    return 0;
}

总结:对于一串数字求取最小公倍数的算法就是将前面2个数求取最小公倍数,再用这个最小公倍数与第三个数找它俩的最小公倍数,再用这个最小公倍数与第四个数找它俩的最小公倍数……
(两个数的最小公倍数就可以代表这2个数!!!相当于2个数合成为1个数)

相关文章

  • 杭电ACM-2028

    题目: 错误代码: 所以为什么错误呢??? 错误原因:sum为前面数的最小公倍数,第二次求最大公约数的时候不应该用...

  • 杭电助手

    杭电助手(服务号hduhelp,订阅号hduhelper)是隶属于杭州电子科技大学党委学工部的校级组织,我们有前端...

  • 杭电2015

    这道题看起来不复杂,但做起来还是挺费工夫的。里面要用很多的循环结构,很容易在些小地方出错。我就是因为那些小问题而搞...

  • 杭电打卡

    这题主要是数学方法求解,其他没什么难度,关键是得出递推公式。 假如第一个和最后一个格子能相同颜色,我们可以很快算出...

  • 杭电oj 第11页 java版答案

    杭电oj 第2000- 2099 题 全答案杭电oj 第十一页答案 具体路径在 src/main/java/com...

  • 杭电ACM1001

    不再更新,杭电ACM的题转到csdn博客

  • 杭电ACM(1013)

  • 二零一七杭电赏梅

    西邻专司花千尊, 东毗惟和草万匀, 纷落梅卿诱草生, 葱绿淡粉妆美人。

  • 杭电-1009 elevator

    这题就是简单的计算,没什么坑直接就ac了,注意更新当前电梯的位置就行。 AC代码

  • 杭电oj 1004

    杭电oj的1004 从这个题开始 我会把自己ac的题目放在简书上方便自己查看 也顺便帮助别人吧

网友评论

      本文标题:杭电ACM-2028

      本文链接:https://www.haomeiwen.com/subject/qeuabttx.html