【问题标题】:Perfect numbers in C, won't printC中的完美数字,不会打印
【发布时间】:2015-07-27 23:11:37
【问题描述】:

我有以下程序,不打印完美数字,只输出不完美的数字 1 和 2。出了什么问题,是范围问题还是循环?在 print 语句后添加 break 语句会导致输出所有数字 1 - 99。

int sum = 0;

for (int i = 1; i < 100; i++) {

    for (int j = 1; j <= i; j++) {

        if (i % j == 0){

            sum += j;}

        if (sum == i){

            printf("%d\n", i);

        }
    }
}

【问题讨论】:

  • 嗯,1 或 2 都不是完美数。所以我会从那个开始。您应该查看this 并从那里开始工作。
  • 内循环的每次迭代,Sum 都应该从零开始。
  • 注意100以下只有两个完美数(不是1和2,那是你的循环条件错误造成的),1亿以下只有5个,所以你找不到很快就会有很多人使用这种方法,希望这只是一个练习。 =)
  • 在询问有关运行时问题的问题时,请发布干净编译的代码(发布代码甚至没有开始编译。)然后(对于这种情况)发布预期输出和实际输出.由于主题是“完美数字”,因此发布完美数字的定义。

标签: c


【解决方案1】:

三个问题:

  1. sum 必须为每个 i 初始化为零,而不仅仅是在开始时
  2. 第二个循环条件必须是j &lt; i,根据完美数的定义,数字本身被排除在外
  3. 检查sum == i 和后面的printf 必须移到内部循环之外,否则会打印中间结果

【讨论】:

  • 这是一个完美的答案——我正在删除我的答案。
【解决方案2】:

鉴于此代码,它包含所有先前的 cmets/answers:

#include <stdio.h>


int main( void )
{
    int sum = 0;

    for (int i = 1; i < 100; i++)
    {
        sum = 0; // reset on each new number

        for (int j = 1; j < i; j++)
        {
            if (i % j == 0)
            {
                sum += j;
            } // end if
        } // end for

        if (sum == i)
        {
             printf("%d\n", i);
        } // end if
    } // end for
    return 0;
} // end function: main

输出是 6 和 28

【讨论】:

    【解决方案3】:

    我觉得你不需要一直测试到i(j

    #include<stdio.h>
    void main() {
        int sum;
        for (int i = 1; i < 100; i++) {
            sum = 0;
            for (int j = 1; j <= i/2; j++) {
                if (i % j == 0) {
                    sum += j;
                }
            }
            if (sum == i) {
                printf("%d\n", i);
            }
        }
    }
    

    【讨论】:

    • 如果我们想进行优化,还有很多其他的事情需要改变,但最终打印出 32 位 @987654322 范围内所有完美数字的最快代码@ 是puts("6\n28\n496\n8128\n33550336"); =)
    • @Arkku 我可以想出更快的代码来打印所有奇怪的代码,即使使用 unsigned long long 也是如此
    猜你喜欢
    • 2015-10-14
    • 1970-01-01
    • 1970-01-01
    • 2020-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多