2017-02-15 3 views
1

が表示され、ユーザーがゼロを入力するまで数字が素数であるかどうかをテストできます。しかし、約6つの数値をテストした後、それは数字が非素数の素数でもあり、素数の素数ではない数字を出力するように、間違ったメッセージを出力します。ユーザーがゼロを入力するまで番号をテストできる素数プログラム。ただし、6つの数字をテストした後、間違ったメッセージ

package com.selfexercise.exercise; 

/** 
* Created by One on 2/15/2017. 
*/ 
import java.util.Scanner; 
public class PrimeNumbers { 
public static void main(String[] args) { 
    int n; 
    boolean flag=true; 

    Scanner in = new Scanner(System.in); 
    for(;;) { 
     System.out.print("\nPlease enter a number : "); 
     n = in.nextInt(); 

     for (int i = 2; i <= n/2; i++) { 
      if (n % i == 0) { 
       flag = false; 
       break; 
      } 
     } 
     if (flag) { 
      System.out.println(n + " is a prime number"); 
     } else { 
      System.out.println(n + " is not a prime number"); 
     } 
     if(n==0) 
      break; 
    } 
} 
} 
+3

あなたの 'for(;;)'ループの内側(そして内側の 'for'ループの前)に' flag = true'が必要なので、入力された新しい数字ごとにフラグが真に始まります。 – khelwood

+0

ああ、私はそれを自分で解決しました。問題は永遠のループの外側にflag = trueを置くことでした。 foreverループの開始中括弧の直後にforeverループの中にflag = trueを入れる必要があります。 – eyajosh

+0

ええ、私は自分のコードを読んでいることを証明するのによくなっていると思います。とにかく、迅速な対応に感謝します。おかげです! – eyajosh

答えて

2

プログラムの開始時にflag = trueと宣言します。ファクタを見つけるとすぐに、それはfalseに設定されます。その数字はプライムではありません。

しかし、別の番号がユーザによって入力された場合、flagであり、すでに偽です。ユーザーから新しい番号を取得するたびにtrueに設定する必要があります。

// no need to declare flag before the loop 

for(;;) { 
    // initialise flag to true for each input number 
    boolean flag = true; 
    System.out.print("\nPlease enter a number : "); 
    n = in.nextInt(); 
    ... 
+0

大変ありがとうございます。 – eyajosh

0
if (flag) { 
     System.out.println(n + " is a prime number"); 
    } else { 
     System.out.println(n + " is not a prime number"); 
    } 
flag = true; 

うまくいけば、それが役立つだろうか?変数フラグが偽になると、あなたのコードは、(;;)ループ内の次の反復のためにそれをデフォルト状態に戻すような指示を許可しません。

+0

大変ありがとうございます。 – eyajosh

0

他の人があなたのエラーを指摘しています。私はあなたのコードにいくつかの他のコメントがあります。

まず、プライムチェックシステムは機能しますが、非効率的です。 Eratosthenesのふるいは、使用している方法であるTrial Divisionよりもはるかに高速です。たとえトライアル部門であっても、n/2の代わりにsqrt(n)の制限を使用し、偶数を別々に扱うことで、コードを高速化することができます。別のブール法にプライムチェックを入れて、メインコードクリーナーを維持するためにも伝統的である:この方法は、あなたが素数かどうかを確認する必要がある時はいつでも再利用できること

boolean isPrime(int num) { 

    // Low and negative numbers. 
    if (num < 2) { 
    return false; 
    } 

    // Even numbers. 
    if (num % 2 == 0) { 
    // Two is the only even prime. 
    return num == 2; 
    } 

    // Odd numbers. 
    for (int i = 3; i * i <= num; i += 2) { 
    if (num % i == 0) { 
     return false; 
    } 
    } 

    return true; 

} // end isPrime() 

第2に、breakを使用して終了するなど、メインコードでのループ処理が不便です。 0が入力されるまで、あなたが繰り返し、ユーザーからの入力を読んでいることを考えると、それからdo ... whileループは最高のフィット:

public static void main(String[] args) { 

    int n; 
    Scanner in = new Scanner(System.in); 

    do { 
     System.out.print("\nPlease enter a number or 0 to quit : "); 
     n = in.nextInt(); 

     if (isPrime(n)) { 
      System.out.println(n + " is a prime number."); 
     } else { 
      System.out.println(n + " is not a prime number."); 
     } 
    } while (n != 0); 

} 

これはあなたのflag変数を置き換え、以前からisPrime()方法を、使用しています。 do ... whileループを使用すると、明示的にループからbreakが削除されます。これは、あなたが以前使っていたループよりも、ループのスタイルがあなたの行っていることに適しているからです。 forループは、テストしなければならない数字の数を事前に知っていればより良いでしょう。

+0

ありがとう、私はあなたの提案に基づいてコードを変更します。 – eyajosh

関連する問題