1

次の疑似コードを使用して完全数クラスを作成することになっています。

For i from 2 to “very large”,
    For j from 2 to √i,
         if (j evenly divides i),
              accumulate the sum j and i/j
    if √i is an integer
         subtract √i ... you added it twice
    if the sum of divisors == i
         Print the number ... it’s perfect!

これが私のバージョンです。それは実行されますが、私が望むことはまったくしません。実行するだけで、出力として何も生成しません。誰かが私のプログラムの何が問題なのか教えてもらえますか? それは私をとても悩ませています。

import java.util.Scanner;

public class PerfectNumber {

public static void main(String[] args) {
  double sum = 0
  double newsum = 0;
  for (int i = 2; i < 1000000; i++) {
     for (int j = 2; i<Math.sqrt(i); j++){
        if (i%j==0){
           sum = j + (i%j);

        }
        if (Math.sqrt(i)==(int)i){ 
        newsum = sum - Math.sqrt(i);
        }   
        if (sum == 0) {
        System.out.println(sum + "is a perfect number");
        }

}
}
}
}
4

7 に答える 7

2

アルゴリズムによるいくつかの間違い:

  1. sum = j + (i%j);に変更する必要がありますsum = j + (i/j);

  2. この作品:

    if (Math.sqrt(i)==(int)i){ 
        newsum = sum - Math.sqrt(i);
    }   
    if (sum == 0) {
        System.out.println(sum + "is a prime number");
    }
    

上の「for」の下にあるはずです

  1. Math.sqrt(i)==(int)ii が 1 でない限り、決して true にはなりません。これをそのようにチェックしたい場合は、Math.sqrt(i)==((int) Math.sqrt(i))

はるかに多くのエラーがありますが、最も簡単な方法は次のとおりです。

double sum = 0;
for (int i = 1; i <= 10000; i++) {
    for (int j = 1; j < i; j++) {
        if (i % j == 0) {
            sum += j;
        }
    }
    if (i == sum) {
        System.out.println(sum + " is a prime number");
    }
    sum = 0;
}
于 2015-04-30T19:17:07.060 に答える
1

あなたのコードにはいくつかの誤りがあります。これが修正されたコードで、変更点がコメントされています。

// newsum isn't needed; declare sum to be int to avoid floating-point errors
int sum = 0;
for (int i = 2; i < 1000000; i++) {
    // Start with 1; every natural number has 1 as a factor.
    sum = 1;
    // Test if j, not i, is less than the square root of i.
    for (int j = 2; j <= Math.sqrt(i); j++){
        if (i % j == 0){
            // Add to sum; don't replace sum.  Use i / j instead of i % j.
            sum = sum + j + (i / j);
            // Move test inside this if; test if j is square root of i
            if (j*j == i){
                // I used j because we know it's the square root already.
                sum = sum - j;
            }
        }
        // Move print outside of inner for loop to prevent multiple 
        // printings of a number.
        // Test if sum equals the number being tested, not 0.
        if (sum == i) {
             // Space before is
             System.out.println(sum + " is a perfect number");
        }
    }
}

出力:

6 is a perfect number
28 is a perfect number
496 is a perfect number
8128 is a perfect number
于 2015-04-30T19:30:38.303 に答える
1
public static void main(String[] args){
    int min = 2; 
    int max = 1000000;
    int sum = 0;
    for (; min <= max; min++,sum = 0) { 
        for (int e = 1; e < min; e++)
            sum += ((min % e) == 0) ? e : 0;

        if (sum == min){           
            System.out.println(sum);
        }          
    }      
}
于 2015-09-17T16:11:55.637 に答える
0

これは、完全数を求めるプログラムを作成できる最も単純で簡単な形式です....このコードは 25 以内の完全数を与えます.必要に応じて変更できます.

import java.util.Scanner;
public class PerfectNumber {
    public static void main(String[] args) {
        int n,i,j,count=0;

        for(i=2;i<=25;i++) {
            for(j=1;j<=i;j++) {
                if(i%j ==0)    /*count increments if a reminder zero*/ {
                    count++;
                }
            }
            /*since a perfect number is divided only by 1 and itself
              if the count is 2 then its a prime number...*/

            if(count==2)
                System.out.println(i);
            count=0;
        }
        return 0;
    }
}
于 2015-09-17T16:35:12.137 に答える
0
for(n=1;n<=number;n++){ //calculates the sum of the number.
 int i=1;
 int sum = 0;
  while(i<n){
    if(n%i==0)
         sum+=i;
        i++;
  }
        if(sum==n){ //if the sum is equal to its sum :
          System.out.print(n+": ");
          for (int j = 1;j<n;j++){
              if(n%j==0){
              System.out.print(j+" ");
          }
          }
          System.out.println();
      }
  }
于 2018-03-15T10:39:31.503 に答える
0

見てくれてありがとう

  public boolean testPerfect(int n){
    int i=1;
    int sum=0;
    while(i<n){
        if(n%i==0)
        {
            sum+=i++;
        }
        else{
        i++;}
    }
    if (sum==n){
        return true;
    }
    return false;
}
于 2021-11-30T12:04:52.227 に答える