【问题标题】:Perfect Number In CC中的完美数
【发布时间】:2011-06-01 01:26:38
【问题描述】:

我需要编写一个 C 程序来找到完美数..

main()
{
    int n=1000,sum = 0;
    for(int num = 1; num <= n; num++)
    {
        sum = 0;
        for(int i = 1; i < num; i++)
        {
            if(!(num%i))
            {
                sum+=i;
            }
        }
        if(sum == num)
            printf("\n%d",num);
    }
}

if(!(num%i)) - 这是 d 行,我不明白。

如果有其他简单的方法请给我建议

【问题讨论】:

  • % 运算符用于将左侧除以右侧的余数 1 % 3 = 1; 2% 3 = 2; 3% 3 = 0; 4% 3 = 1; 5% 3 = 2; 6 % 3 = 0;
  • 什么是完美数? 42? :) 你写了你不理解的代码?怎么会?
  • 你把它读作if not remainder of num / i
  • @Felix: 一个数,是其除数之和

标签: c perfect-numbers


【解决方案1】:

num % i 表示“num modulo i”;它返回数字除法的提醒(因此,0i-1 之间的数字)。

在 C 中,0 为假,所有其他数字为真,因此!(num % i) 测试“num modulo i”是否为零,或者用简单的数学语言来说,如果 num 可以被 i 整除。

【讨论】:

    【解决方案2】:

    if(!(num%i)) 仅表示if( (num%i) == 0 )

    【讨论】:

    • 另外,就风格而言,就像 ykatchou 那样写出来。清晰度值得额外输入 5 个左右的字符。
    【解决方案3】:

    如果您正在寻找一种更有效的方法来查找完美数字,您可能需要阅读Wikipedia page on perfect numbers。在其中你会发现没有已知的奇完美数(并且使用你的方法你不会找到任何东西)并且所有偶完美数都是以下形式:

    2^(p - 1)*(2^p - 1) 其中2^p - 1 是质数,因此p 是质数。因此,如果您想找到偶数完美的数字,请检查所有素数 p 的素数 2^p - 1,如果是,2^(p - 1)*(2^p - 1) 是完美的。

    如果您只想使用简单的循环找到一些小的完美数,您可以通过注意如果i 除以num,那么num / i 也可以使您的方法更有效。也就是说,您只需要循环直到num 的平方根并将inum / i 对添加到sum。请注意,如果num 是平方,则num 的平方根只需添加一次。

    请注意,如果您以这种方式计算 sum,那么对于完美数字,它的值将是 2 * num,而不是 num

    【讨论】:

    • @Harish,更多信息请参见此处mersenne.org 并请注意,您的程序将需要很长时间才能运行,但是如果您想要多于前十个左右的完美数字,您可以这样做.
    【解决方案4】:

    if(!(num%i)) 代码以非常简单的方式检查 num 的值是否除以 i,如果余数为 0,则返回...因此,此处使用取模运算符 % 来查找余数。 . 这段代码类似于if(num % i==0)。 如果它返回 true,那么 i 的值应该加上 sum。最后如果 sum 的值等于 num 的值,则该数字是完美的并显示该数字!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-05
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多