-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 Primes の配列を埋める方法に基づいて、関連する Mersenne Prime28が含まれます。Mersenne Primes は (2^p - 1) の形式です。最初のループでmainは、Mersenne Primes を配列に格納します。

あなたは理解する必要があります:

  • 完全数に関係するメルセンヌ素数はどれ28?
  • に関連付けられている Mersenne Prime を除外するには、最初のループ (または2 番目のループ)のインデックスをどのように変更すればよいでしょうか?main28
于 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 に答える