2016-12-22 8 views
-1

このプログラムは、例えば、あなたが入力したint型まですべての素数を印刷するようになっている:印刷素数

Enter a Number: 
20 
2 
3 
5 
7 
11 
13 
17 
19 

私はちょうど私のプログラムを動作させることはできません、私は本当に「ドン何をすべきかを知っているので、誰かがそれを見直して修正しようとすれば、それは大変感謝しています。

import java.util.Scanner; 
public class PrimeGenerator { 
public static void main(String args[]) { 
    Scanner k = new Scanner(System.in); 
    System.out.println("Enter an integer"); 
    int number = k.nextInt(); 
    PrimeGenerator matt = new PrimeGenerator(); 
    System.out.println(matt.nextPrime(number)); 
} 

private int number; 

public PrimeGenerator(int n) { 
number = n; 
} 

public int nextPrime(int number) { 
    for (int i = 1; i <= number; i++) { 
     boolean prime = true; 
     for (int j = 2; j < i; j++) { 
      if (i % j == 0) { 
       prime = false; 
      } 
     } 
     if (prime){ 
      return i; 
     } 
    } 
    } 
} 
+1

[MCVE]与えてください。正確にはうまくいかない? – jonrsharpe

+0

はい、うまくいかないことは明らかです。エラー?例外?間違った出力? – csmckelvey

+0

JavaScriptタグを削除してください – chester

答えて

2

あなたはすでに実際に存在しています。あなたはちょうどプログラムフローに間違いを持っ​​ています。改善/修正する

for (int i = 1; i <= number; i++) { 
    boolean prime = true; 
    for (int j = 2; j < i; j++) { 
     if (i % j == 0) { 
      prime = false; 
     } 
    } 
    if (prime){ 
     return i; //<-- this return will terminate nextPrim 
    } 
} 

もの:

  • nextPrimは、可能なすべてのプログラム・ブランチ内の値を返す必要があります。これは、nextPrimが指定された範囲内の数字を見つけず、ループから抜け出す場合を考えます。今やプログラムは戻り値なしで止まってしまいます。
  • 見つかった最初のプリム数を返す代わりに、見つかったプリム数を印刷してジェネレータを実行し続けることができます。あなたは今すぐnextPrimvoidと宣言することができるので、ニース、簡単、何かを返すことで面倒を解決します。この変更を明確にするために、printPrimsなどの名前を変更することをお勧めします。
  • 合格numbernumberをプリムジェネレータに一度だけ渡すだけで、少しの労力を節約できます。最も簡単な解決策は、nextPrim/printPrimsに渡すことです。これで、インスタンス変数numberとコンストラクタが削除され、コンストラクタのシグネチャの問題を解決できます。
  • 1は、ペタンティックであるプリム数ではありません。だから、ペダンティックにして、printPrimsの外側ループを2で始めると、2がプリムであることがチェックされる最初の数字になります。

それでは、コードにこれを入れてみましょう:

import java.util.Scanner; 

public class PrimeGenerator { 
    public static void main(String args[]) { 
     Scanner k = new Scanner(System.in); 
     System.out.println("Enter an integer"); 
     int number = k.nextInt(); 
     PrimeGenerator matt = new PrimeGenerator(); 
     matt.printPrims(number); 
    } 

    public void printPrime(int number) { 
     for (int i = 2; i <= number; i++) { 
      boolean prime = true; 
      for (int j = 2; j < i; j++) { 
       if (i % j == 0) { 
        prime = false; 
      } 
     } 
     if (prime){ 
      System.out.println(i); 
     } 
    } 
} 

いくつかの一般的なヒント:

  • 作業コンパイルエラーによる。コード内でエラーが発生した場所とエラーを正確に伝えます。
  • プログラムを実装する前に、プログラムの流れについて考えてみてください。
  • タスクを小さなタスクに分割し、これらを順番に実装します。たとえば、この問題の場合は、最初に2, numberの範囲のすべての数値を出力します。その後、さらに進んでプリム数を除外する機能を追加します。これで、互いに独立して簡単にテストできる2つのコンポーネントが得られました。
0

あなたはほぼありましたが、あなたのnextPrimes機能は、あなたがiを返したとき、このような何かしようと途中で終了しました:多分、あなたのコードを持ついくつかの問題がありますhere!

0

それを試してみてください

import java.util.Scanner; 

class Main { 
    public static void main(String[] args) { 
    Scanner k = new Scanner(System.in); 
    System.out.print("Enter an integer:"); 
    int number = k.nextInt(); 
    printPrimesUptoN(number); 
    } 

    public static void printPrimesUptoN(int n){ 
    for(int i=2;i<n;i++){ 
     boolean isPrime = true; 
     for(int j=2;j<i;j++){ 
     if(i % j == 0){ 
      isPrime = false; 
      break; 
     } 
     } 
     if(isPrime) 
     System.out.println(i); 
    } 
    } 
} 

を私たちは一緒にそれを修正することができます。まず最初に、returnステートメントがnextPrimeにありません。空のデフォルトコンストラクタPrimeGenerator()はありません。これは、単一引数のコンストラクタを作成したためです。これは、あなたが期待している結果が得られますが、それは、少なくともコンパイルするソリューションではありません

public class PrimeGenerator { 
    public static void main(String args[]) { 
     Scanner k = new Scanner(System.in); 
     System.out.println("Enter an integer"); 
     int number = k.nextInt(); 
     // you probably want to pass your maximum value to the constructor 
     PrimeGenerator matt = new PrimeGenerator(number); 
     // without a loop of some sort this will only print a single prime number, e.g. 
     // Enter a Number: 
     // 20 
     // 2 
     System.out.println(matt.nextPrime(number)); 
    } 

    private int number; 

    public PrimeGenerator(int n) { 
     this.number = n; 
    } 

    // you're using the argument as upper boundary for your prime detection while not increasing your lower boundary 
    // also you're checking if i is a prime here which you always start at 1. this should always return the same value because once you find a prime number you return 
    // you should consider using an algorithm like Sieve of Eratosthenes (or advanced verions thereof) to determine if a given number is prime 
    public int nextPrime(int number) { 
     for (int i = 1; i <= number; i++) { 
      boolean prime = true; 

      for (int j = 2; j < i; j++) { 
       if (i % j == 0) { 
        prime = false; 
       } 
      } 

      if (prime){ 
       return i; 
      } 
     } 

     // you need to return something at the end of this method or throw an exception 
     throw new IllegalStateException("no more prime numbers available!"); 
    } 
} 

:これを試してみてください。その点から、前進してアルゴリズム上の問題を修正することができます。

0

あなたの元のエラーがでました

PrimeGenerator matt = new PrimeGenerator(); 

エラー:あなたは、クラス名と同じ名前のメソッドを持っていましたが、私はあなたがそれを使用していたとは思わない

PrimeGenerator.java:7: error: constructor PrimeGenerator in class PrimeGenerator cannot be applied to given types; 
    PrimeGenerator matt = new PrimeGenerator(); 
         ^
    required: int 
    found: no arguments 
    reason: actual and formal argument lists differ in length 
1 error 

お知らせコンストラクタとして、そしてもしあなたがそれだったら、それを与えなかったintを取った。ライン13上のあなたの方法だった:

public PrimeGenerator(int n) { 
number = n; 
} 

は、元のコンストラクタを使用して、

import java.util.Scanner; 

public class PrimeGenerator { 
     public static void main(String args[]) { 
       Scanner k = new Scanner(System.in); 
       System.out.println("Enter an integer"); 
       int number = k.nextInt(); 
       new PrimeGenerator().nextPrime(number); 
     } 

     public void nextPrime(int number) { 
       for (int i = 1; i <= number; i++) { 
         boolean prime = true; 
         for (int j = 2; j < i; j++) { 
           if (i % j == 0) { 
             prime = false; 
           } 
         } 
         if (prime){ 
           System.out.println(i); 
         } 
       } 
     } 
} 

に代わりにオプションを

new PrimeGenerator().nextPrime(number); 

をやってみ、あなたはこれを分離することができます。

import java.util.Scanner; 

public class PrimeGenerator { 

     private int number; 

     public static void main(String args[]) { 
       Scanner k = new Scanner(System.in); 
       System.out.println("Enter an integer"); 
       int number = k.nextInt(); 
       // Initialize with a number. 
       PrimeGenerator pg = new PrimeGenerator(number); 
       pg.printPrimes(); 
     } 

     // This is the constructer you were misusing. 
     public PrimeGenerator(int n) { 
       number = n; 
     } 

     public void printPrimes() { 
       // Actually use your private number variable. 
       for (int i = 1; i <= number; i++) { 
         boolean prime = true; 
         for (int j = 2; j < i; j++) { 
           if (i % j == 0) { 
             prime = false; 
           } 
         } 
         if (prime){ 
           System.out.println(i); 
         } 
       } 
     } 
} 
0

いくつかの問題があります。

  1. が、あなたはIDEを使用していますか?もしそうなら、それはどちらですか、そうでなければなぜですか?初心者であれば、Eclipse IDEやNetBeans IDEのように使用することをお勧めします。
  2. あなたのアルゴリズムに関して、一見すると、コンパイルとロジックの問題があります。
  3. コンパイルの問題は、クラスの実行が機能しない場合です。この場合、方法nextPrime(int number)intを返さなければなりません。 return句を指定しても、プライムがfalseの場合、このメソッドは値を返しません。あなたは簡単にIDEでこの問題を見つけることができます。
  4. 別のコンパイルの問題は、センチネルまたは変数iは、forループの内部にある、そしてあなたはそれの価値OUTSIDEだ印刷されています。再度、IDEがこの問題を解決するのに役立ちます。
  5. ロジックの問題は、あなたが値を返すされている、であるかのフラグprimeは真であるので、メソッドを呼び出すときに、(働いていると仮定)あなただけが呼ぶときONE値を取得する場合にのみSystem.out.println(matt.nextPrime(number));

正しいに実装は、これらの考慮事項を持っているでしょう:

  1. 方法は、あなたがそれを呼び出す、mainメソッドで印刷する必要はありませんを意味し、すなわちpublic void nextPrime(number) { ...、戻りません。
  2. このメソッドは実際に数値を出力します。このようにして
  3. 、あなたはi % jがゼロの異なる場合、その後、あなたはforループを壊し、より多くの仕切りを処理する必要はありません確認することができます。
  4. 印刷してください。
  5. それだけです。

    public static void main(String [] args) { 
        . 
        . 
        . 
        PrimeGenerator matt = new PrimeGenerator(); 
        matt.nextPrime(number); 
    } 
    
    public void printPrime(int number) { 
        boolean prime = true; 
        for (int i = 2; i <= number; i++) { 
         prime = true; 
         for (int j = 2; j < i; j++) { 
          if (i % j != 0) { 
           prime = false; 
           break; 
          } 
         } 
         if (prime) { 
          System.out.println(i); 
         } 
        } 
    }