0

最大1000個の整数の制限付き定数入力のために、Javaでこのプログラムを試みました。期待される出力が得られません:(

package perfect.numbers;
import java.util.ArrayList;
public class PerfectNumbers {

    public static void main(String[] args) {
        long num=1000; int sum = 0;
        ArrayList<Integer> perfectList = new ArrayList<>();
        ArrayList<Integer> factorList = new ArrayList<>();
        for(int i=1; i<num; i++)
        {
           for(int j=1; j<i/2; j++)
           {         
                if(i%j==0)
                {
                    factorList.add(j);
                }

                for(int h=0; h<factorList.size(); h++)
                    sum=sum+factorList.get(h);

                if(sum==i)
                perfectList.add(i);
                sum=0;
            }
        }

        System.out.println("The Perfect numbers upto 1000 are : ");

        for(Integer item : perfectList)
        {
            System.out.print(item + "/t");
        }
    }
}
4

6 に答える 6

2

あなたのコードには複数の問題があります:

  1. factorList がクリアされていません
  2. たとえば、6 は完全数 = 1+2+3 ですが、inter for ループは 2 で停止します (j<3)。
  3. また、2 番目の内側の for ループから移動した 3 番目の内側の for があります。

正しいバージョンは次のとおりです。

import java.util.ArrayList;

public class PerfectNumbers {

    public static void main(String[] args) {
        long num = 1000;
        int sum = 0;
        ArrayList<Integer> perfectList = new ArrayList<>();
        ArrayList<Integer> factorList = new ArrayList<>();
        for (int i = 6; i < num; i++) {
            factorList.clear();
            for (int j = 1; j <= i / 2; j++) {
                if (i % j == 0) {
                    factorList.add(j);
                }
            }
            sum = 0;
            for (int h = 0; h < factorList.size(); h++) {
                sum = sum + factorList.get(h);
            }
            if (sum == i) {
                perfectList.add(i);
            }

        }
        System.out.println("The Perfect numbers upto 1000 are : ");
        for (Integer item : perfectList) {
            System.out.print(item + "/t");
        }
    }
}
于 2013-09-09T09:08:18.893 に答える
1
  1. 合計計算コードを 2 番目のループから 1 番目のループに移動します。
  2. 合計計算後に factorList をクリアします。
于 2013-09-09T09:18:54.123 に答える
1

内部ループ (つまり、インデックス変数としてのforループ) に明らかな問題があります: 終了テストは. これによりループが終了するため、に到達することはありませんが、すべての偶数の整数には適切な除数があります。終了テストを に変更する必要があります。jj<i/2ji/2ii/2j <= i/2

おそらく、外側のループの終了テストを に変更することもできますi <= num。それ以外の場合は、 までの整数のみをチェックします num - 1

また、すべての潜在的な適切な約数ではなく、潜在的な完全数ごとに 1 回だけ実行する必要があるため、合計の計算とチェックを内側から外側のループに移動する必要があります。

于 2013-09-09T09:19:27.117 に答える
1

グーグルで答えを見つけました。要件に応じて少し更新しました

以下の出力を期待していますか

1000 までの完全数は 0 6 28 496 です。

public class PerfectNumbers {   
    public static boolean  isPerfectNumber(int number){        
        int temp = 0;
        for(int i=1;i<=number/2;i++){
            if(number%i == 0){
                temp += i;
            }
        }
        if(temp == number){           
            return true;
        } else {            
            return false;
        }
    }

 public static void main(String[] args) {
    System.out.println("The Perfect numbers upto 1000 are :");
     for (int i=0;i<= 1000; i++){
         if(PerfectNumbers.isPerfectNumber(i)){
            System.out.println(i);
         }
     }              
 } 
}
于 2013-09-09T09:11:42.827 に答える
1

内部 for ループは次のようにする必要があると思います:

for(int j=1; j<=i/2; j++)
{         
       if(i%j==0)
       {
                factorList.add(j);
       }
}
for(int h=0; h<factorList.size(); h++)
      sum=sum+factorList.get(h);

if(sum==i)
perfectList.add(i);
sum=0;

ここでは、合計を実行する前に内側の forloop を閉じています。あなたの場合、条件を満たす新しい数字が発生するたびi%j==0に合計が計算され、合計がiに等しくない場合、合計は0にリセットされます。これが問題の原因です。

そして、内側の for ループを に変更しましたj<=i/2。説明 : i = 6 を取ります。そして、6 の因数が 1,2,3 であることを知っています。内部 for ループの場合j<i/2は、数値 3 を無視してそのインスタンスから終了するため、factorlist で 3 が取得されることはありません。これがあなたのすべての質問に答えることを願っています。

于 2013-09-09T09:07:57.303 に答える
0
/*
@ Author 12CSE54
@ Date 28.10.14
*/

import java.util.*; 

public class perfect {
    Scanner s = new Scanner(System.in);

    public void check() {
        System.out.println("Enter the number\n");
        int p = sc.nextInt();
        int temp = 0;

        for(int i = 1; i <= p / 2; ++i) {
            if (p % i == 0)
                temp += i;
        }

        if (temp == p)
            System.out.println("It is a perfect number");
        else 
            System.out.println("It is not a perfect number");
    }

    public static void main(String args[]) {
        perfect p1 = new perfect();
        p1.check();
    }
}
于 2014-10-28T11:21:58.293 に答える