求指导一下c语言输出完数问题?

左边是题目,右边是我写的代码👇

img


我一直错“最大范围”这个问题,然后看了一下别人写的代码加了一行(红色标出处),虽然答案对了可是还是无法理解pta的评分点是什么意思👇

img


谢谢你们的答疑解惑🥰

【以下回答由 GPT 生成】

根据你提供的代码,我注意到你忘记在程序开始时初始化变量sum。这可能会导致未定义行为。请将变量sum初始化为0,如下所示:

int num, i, sum = 0;

另外,在判断一个数是否为完数时,你需要在循环内部计算因子的和。否则,无论在何时检查sum与num的相等性,都会得到错误的结果。在你的代码中,你将sum与num相等性判断放在了循环之后,这会导致sum无法正确更新,并且只会打印最后一个完数。你可以将sum与i的相加操作放在if条件内部,如下所示:

if (num % i == 0)
{
    sum += i;
}

此外,你打印完数的语句位置也有问题。你需要将这行代码放在循环内部,以便实时打印完数,而不仅仅是打印最后一个完数。将printf语句移动到if语句的内部,并在循环结束后添加一个换行符,如下所示:

if (sum == num)
{
    printf("%d ", num);
}
printf("\n");

最后,为了满足PTA评分标准,你可以添加一个判断,如果输入的数字小于等于1,则直接输出"没有完数",如下所示:

if (num <= 1)
{
    printf("没有完数\n");
    return 0;
}

下面是经过修改后的代码:

#include <stdio.h>

int main()
{
    int num, i, sum = 0;
    printf("请输入一个正整数: ");
    scanf("%d", &num);

    if (num <= 1)
    {
        printf("没有完数\n");
        return 0;
    }

    printf("完数是: ");
    for (i = 1; i < num; i++)
    {
        if (num % i == 0)
        {
            sum += i;
            printf("%d ", i);
        }
    }
    printf("\n");

    return 0;
}

希望这些修改能够帮助你解决问题并理解PTA评分标准的含义。如果你还有任何问题,请随时提问。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

1 不是完数, 因为你的代码里不能将 1 排除,当 number = 1 时, 函数里返回值是 1,所以判断出错了。两个函数可以这么写,供参考:

int factorsum(int number) {
    int s = 0;  
    for (int i = 1; i < number / 2 + 1; i++) {
        if (number % i == 0)  s += i; 
    }
    return s;
}
void PrintPN(int m, int n) {
    int ss = 0; 
    for (int i = m; i <= n; i++) {
        if (factorsum(i) == i) {
            ss++;
            printf("%d = 1", i);
            for (int j = 2; j < i / 2 + 1; j++) {
                if (i % j == 0)  
                    printf(" + %d", j); 
            }
            printf("\n");
        }
    }
    if (ss == 0) 
        printf("No perfect number"); 
}