always_love_life 2021-03-16 12:25 采纳率: 20%
浏览 65
已采纳

求求大神看下两段代码的区别

原题目

古希腊数学家毕达哥拉斯在自然数研究中发现,220的所有真约数(即不是自身的约数)之和为:

1+2+4+5+10+11+20+22+44+55+110=284。

而284的所有真约数为1、2、4、71、 142,加起来恰好为220。人们对这样的数感到很惊奇,并称之为亲和数。一般地讲,如果两个数中任何一个数都是另一个数的真约数之和,则这两个数就是亲和数。
你的任务就编写一个程序,判断给定的两个数是否是亲和数

输入

输入数据第一行包含一个数M,接下有M行,每行一个实例,包含两个整数A,B; 其中 0 <=A,B <=600000 ;

输出

对于每个测试实例,如果A和B是亲和数的话输出YES,否则输出NO。

我写的

#include<stdio.h>
int amicablenumber(int a,int b);
int main()
{
    int n,a,b;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d %d",&a,&b);
        if(amicablenumber(a,b))
        printf("YES\n");
        else
        printf("NO\n");
    }
    return 0;
}
int amicablenumber(int a,int b)
{
    int i=0,j=0;
    for(int k=0;k<a;k++)
    {
        if(a%k==0)
        i+=k;
    }
    if(i==b)
    {
        for(int k=0;k<b;k++)
        {
            if(b%k==0)
            j+=k;
        }
        if(j==a)
        return 1;
        else
        return 0;
    }
    else 
    return 0;

正确答案

#include <stdio.h>

void function( int a, int b );

/*-----------------------------------------*/

int main()

{

    int N, a, b;

    scanf"%d", &N );

 

    for int i = 0; i < N; i++ )

    {

        scanf"%d%d", &a, &b );

        function( a, b );

    }

 

    return(0);

}

 

/*-----------------------------------------*/

void function( int a, int b )

{

    int suma = 0, sumb = 0;

 

    for int i = 1; i <= a / 2; i++ )

    {

        if ( a % i == 0 )

            suma += i;

    }

 

    if ( suma == b )

    {

        for int j = 1; j <= b / 2; j++ )

        {

            if ( b % j == 0 )

                sumb += j;

        }

 

        if ( sumb == a )

            printf"YES\n" );

        else

            printf"NO\n" );

    }else

        printf"NO\n" );

 

    return;

}

  • 写回答

2条回答 默认 最新

  • 蒟蒻一枚 2021-03-16 16:20
    关注

    其实问题很简单。

    这个是你代码的执行结果。输入这个就会没有输出。而你的函数里无论如何正常执行的话都会有返回值,这说明你的代码运行错误了。

    仔细分析一下,你在function函数里的for循环,是从0开始依次取mod的。mod的原理就是用除法,而0是不能作为除数的,否则就会RE,所以执行不成功。

    #include<stdio.h>
    int amicablenumber(int a,int b);
    int main()
    {
        int n,a,b;
        scanf("%d",&n);
        for(int i=0;i<n;i++)
        {
            scanf("%d %d",&a,&b);
            if(amicablenumber(a,b))
            printf("YES\n");
            else
            printf("NO\n");
        }
        return 0;
    }
    int amicablenumber(int a,int b)
    {
        int i=0,j=0;
        for(int k=1;k<a;k++)
        {
            if(a%k==0)
            i+=k;
        }
        if(i==b)
        {
            for(int k=1;k<b;k++)
            {
                if(b%k==0)
                j+=k;
            }
            if(j==a)
            return 1;
            else
            return 0;
        }
        else 
        return 0;
    } 

    这个是改完的代码。

    再看一下运行结果:

    有问题私信我。

    最后补充一句,小学生蒟蒻说的不一定完全对,对的部分可以参考一下。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥15 绘制多分类任务的roc曲线时只画出了一类的roc,其它的auc显示为nan
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?