0

すべての約数を見つけて完全な数を見つけようとしています。それらの合計が数値と等しい場合は、その数値を出力します。しかし、どうやらそれは機能していません。

import acm.program.*;

public class PerfectNumber extends ConsoleProgram{
    public void run() {
        for (int n = 1; n < 9999; n++) {                                                                    
            for (int d = 2; d < n - 1; d++) {
                //d is the potential divisor of n, ranging from 2 to n-1,// 
                //not including 1 and n because they must be the divisors.//
            if (isPerfectNumber(n,d)) 
                print(n );
        }
    }
}

//method that determines if n is perfect number.//
    private boolean isPerfectNumber(int n, int d) {
         while (n % d == 0) {
         int spd = 1;
         spd += d;
         if (spd == n) {
         return true;
         } else {   
          return false;
             }
        }
    }
}
4

2 に答える 2

1

あなたの場合のコードを見ると、ほとんどの場合 false が返されます。あなたが探していたものは少し間違っていると思います。d は n より小さいため、n を d で割ると常に 0 より大きくなります。また、そのループでは d の値を変更することはありません。

解決策は次のとおりです。

     public void run() {
            for (int n = 1; n < 9999; n++) 
{           spd=1;                                                         
                for (int d = 2; d <= n/2; d++) { //no need to go further than n/2
                    //d is the potential divisor of n, ranging from 2 to n-1,// 
                if(n%d==0) spd+=d; //if n divides by d add it to spd.

            }
            if(spd==n) print(n);
        }

これを試して、うまくいくかどうか教えてください。

ここで何かクールなものを見つけました: http://en.wikipedia.org/wiki/List_of_perfect_numbers . 2^(p−1) × (2^p − 1) という式を使用すると、はるかに高速になります。ウィキリンクで式をよく見ることができます。

于 2013-11-08T16:06:53.073 に答える
0

メソッド isPerfect はおそらく次のようになります。

public static boolean isPerfect(int number) {
    int s = 1;
    int d = number / 2;
    for(int i = 2; i <= d; i++) {
        if (number % i == 0) s += i;
    }
    return s == number;
}
于 2013-11-08T16:06:57.170 に答える