-3

你能帮助“调试”这个程序吗?我拥有它几乎完美,但是当我打印它时,它包含我不想要的 "28" 。

public static boolean isPerfectNumber(int n)
{
    int lhs=0,rhs = 0;
    for(int i = 1;i<(n-2);i++)
    {
        lhs += i * (n/i)                                                                   ;
        rhs += i * ((n-1)/i)                                                               ;
    }

    rhs += n;
    if(rhs == lhs)
    {
        return true                                                                        ;
    }
    return false                                                                       ;
}


public static void main(String[] theory) {
    int candArray[] = new int [20]                                                 ;
    for(int i = 2;i<21;i++)
    {
        candArray[i-2] = (int) (Math.pow(2, i-1)*(Math.pow(2, i)-1)                   );
    }

    for(int i = 1;i<20;i++){
        if(isPerfectNumber(candArray[i])                                              )
        {
            System.out.println(candArray[i] + " is a perfectNumber"                       );
        }
    }
}
4

2 回答 2

3

现在你正在使用梅森素数来寻找完美的数字。根据您填充 Mersenne Prime 数组的方式,28包含关联的 Mersenne Prime。梅森素数的形式为 (2^p - 1),您的第一个循环main是将梅森素数存储在一个数组中。

你需要弄清楚:

  • 哪个梅森素数与完美数有关28
  • 现在你应该如何改变你的第一个循环 -或你的第二个循环 - 中的索引main以忽略与 相关的 Mersenne Prime 28
于 2012-07-02T04:22:31.387 回答
1

最快和最简单的改变:

if(isPerfectNumber(candArray[i]) && candArray[i] > 28 )
{
   System.out.println(candArray[i] + " is a perfectNumber" );
}
于 2012-07-02T04:39:49.780 回答