-5

1から1000までの完全数(因数の和=数)を全て列挙するプログラムを作成しなければなりません。

  • これはJavaクラス用で、「for」ループのみを使用する必要があります

コードを 100 回チェックしましたが、出力が得られません。どこかに論理エラーがありません。誰か助けてもらえますか?

public static void main(String[] args)
{
  // variables
  int total = 0;
  final int LIMIT = 1000;

  // for loop to test all numbers 1-1000
  for(int i = 1; i <= LIMIT; i++)
  {
    // if statement
    if((i != 1) && (total == i - 1))
    {
      // prints perfect number
      System.out.println((i - 1) + " is a perfect number");
      // resets total value
      total = 0;
    }
    // gets and add factors as total
    for(int divider = 1; divider < i; divider++)
    {
      if((i % divider) == 0)
      {
        total += divider;
      }
    }
  }
}
4

6 に答える 6

4

あなたの大きな問題はtotal、完全な数を見つけた場合にのみリセットすることです. 完全な数が見つからない場合は、元の合計に次の数の約数を追加し続けます。ごとに新たに開始する必要がありますi

次のようにプログラムを再配置すると、役に立ちます。

public static void main(String[] args) {
    final int LIMIT = 1000;
    for (int i = 0; i <= LIMIT; i++) {
        // Declare total here, inside the loop, so values from previous
        // iterations are discarded.
        int total = 0;
        for (/* your code here */) {
            // add up divisors
            // your code here
        }
        // compare to i, rather than always computing the total for the
        // previous number and comparing to that.
        if (/* your code here */) {
            // print output
            // your code here
        }
    }
}
于 2014-06-09T21:06:45.147 に答える
2

total = 0;if ステートメントの外に移動する必要があります。合計が加算され、リセットされることはありません。

于 2014-06-09T21:04:00.127 に答える
0

(total == i - 1) は、total=0 および i>1 で開始すると一致しません。

于 2014-06-09T21:15:12.007 に答える
0

あなたは近かった。ロジックを少し再評価する必要があります。

public static void main(String[] args) {
        // variables
        int total = 0;
        final int LIMIT = 1000;

        // for loop to test all numbers 1-1000
        for (int i = 1; i <= LIMIT; i++) {

            // gets and add factors first
            for (int divider = 1; divider < i; divider++) {
                if ((i % divider) == 0) {
                    total += divider;
                }

            }

            // then check if sum == number
            // also just print i instead of - 1
            if ((i != 1) && (total == i)) {
                // prints perfect number
                System.out.println((i) + " is a perfect number");

            }

            // alway reset when we are done with a number
            total = 0;

        }

    }
于 2014-06-09T21:15:40.030 に答える
0

アルゴリズムをさまざまな部分に分割することをお勧めします。これにより、一度に小さなタスクに集中できます。

  1. number の約数を求めiます。数値を取得し、その因数の配列を返すメソッド。
  2. 因数を合計します。配列を取り、それを合計として返す単純なメソッド。
  3. メインループ: sum(factors(i)) == i かどうかを確認するだけです

より簡単なもの (ヒント: 2 と 3) から始めて、1 を実装するための完全に非効率的ではない方法を探すことができます。

于 2014-06-09T21:10:17.870 に答える
0
 for(int i=1;i<1000;i++)
    {
        int k=0;

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

        }
        if(k==i)
        {
            System.out.println(k);
        }
    }
于 2014-06-09T21:34:54.257 に答える