-4

Eclipse、Java を使用

ある数が素数(1と自分で割り切れる手段)かどうかを調べる方法を作ってみてください

現在、いくつかの機能が作成されています (以下のコード)。このコードは必要な結果を返しますが、素数であるすべての数字ではなく、33 と 55 のfalse代わりに返されることを意味しtrueます。

コード

private static void numberCheker() throws IOException {
    System.out.println("Enter number - ");
    int number;
    number = getNumber();
    boolean result = true;
    if ((number % 2 == 0) && (number != 2)) {
        System.out.println("Not");
    } else if (number == 1) {
        System.out.println("1 not a valid number");    
    } else if (number == 2)
        System.out.println("Simple");    
    else {
        for (int i = 2; i < number + 1; i++) {
            if (number % i == 0) {
                result = false;
            } else
                result = true;
        }
        if (result = true)
            System.out.println("Simple");    
        else 
            System.out.println("not Simple");
    }
}

質問-「ロジック」のどこを間違えているか-修正に数時間を費やします-しかし、それはできません。なにか提案を?

結果は以下のようになります

Enter number - 
1
simple
Enter number - 
2
simple
Enter number - 
3
simple
Enter number - 
4
not simple
Enter number - 
5
simple

...

しかし、私は得ました

Enter number - 
33
not simple - **WRONG**
Enter number - 
55
not simple - **WRONG**

編集:

マイケル・コニエツカのようにやってくれてありがとう。

 private static boolean numberCheker() throws IOException {

    System.out.println("Enter number - ");
    int number = getNumber();

    for (int i=2;i<number;i++)
     {
        if (number%i==0) return false; 
     }
        return (number>1);

}

および getNumber()

public static int getNumber () throws IOException{
int temp;
try{    
    BufferedReader bReader = new BufferedReader (new InputStreamReader(System.in));
    String resultReader = bReader.readLine();
    temp =  Integer.parseInt(resultReader);
    return temp;
}
catch (NumberFormatException failDescription){
    System.out.println(failDescription);
    return 0;
}

}

今では完璧に機能します。ご協力いただきありがとうございます。

4

8 に答える 8

3

単純数の定義がわかりません

しかし、これは問題になる可能性があります

 if (result=true)

上記をに変更

 if (result)

編集他の人が言及した抜け穴も修正する必要があります。

于 2013-02-04T20:35:40.067 に答える
2
if (result=true)

あなたは二重等号を意味していたと思います:

if (result==true)

if (result=true) と言うと、このステートメントは常に true を返します。

編集: for ループの if-else コンテンツも修正する必要があります。Mr.Meの答えを見てください。

于 2013-02-04T20:36:55.973 に答える
2

クラスの静的メソッドにチェックを入れることができます。

public static boolean isPrime(final int n)
    {
     for (int i=2;i<n;i++)
     {
        if (n%i==0) return false; 
     }
        return (n>1);
    }

2 から n-1 までのすべての数値を反復処理し、n が i で割り切れるかどうかを確認する必要があります。その場合、1 つの因子が見つかったため、メソッドはすぐに false を返すことができます。2 と n-1 の間に因数が見つからず、その数が 1 より大きい場合、それは素数です。メソッドは true を返します。

この方法を使用するには、次のように簡単に使用できます。

public static void main (String[] args) 
  {
     for (int i=1;i<10;i++)
     {
         System.out.println(i+": "+isPrime(i));
     }

どちらが出力されますか

1: 偽

2: 真

3: 真

4: 偽

5: 真

6: 偽

7: 真

8: 偽

9: 偽

于 2013-02-04T21:44:49.760 に答える
1

問題は、数が素数ではないことがわかったときにループから抜け出していないことです。これを解決するには、足してブレークするだけです。あなたのif文の後...ここにコードがあります:

        if (number%i==0){
            result=false;
             break;
            }

編集

また、@Smitが示唆しているように、ifステートメントを修正する必要があります

于 2013-02-04T20:38:25.977 に答える
0

あなたのバグはループの終了にあります。

数値+1までループすることにより、数値は最終的にそれ自体で除算され、余りはゼロになるため、すべての数値は素数ではないように見えます。

代わりにnumber/2までルー​​プします(sqrt(number)の方が効率的ですが、コードの品質はこれが問題ではないことを示しています)

また、ゼロの余りを検出したときにループが発生した場合は、ブレークアウトする必要があります。

于 2013-02-04T20:49:17.610 に答える
0

エラトステネスのふるいと呼ばれるアルゴリズムを見ることをお勧めします: http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes

素数のリストを作成するのは非常に単純なアルゴリズムであり、素数かどうかを判断する方法を理解するのに役立ちます。

ところで - 負の数を除外することを忘れないでください!

于 2013-02-04T21:50:03.210 に答える
0

2 つの問題 1 - false の場合はブレークを追加する必要があります 2 - 最後に if を変更する必要があります

   if (result=true) 

   if (result)

public static void main(String[] args) {

        System.out.println("Enter number - ");
        int number = 55;
        boolean result = true;
        if ((number%2==0) && (number!=2) ){
            System.out.println("Not");
            }
        else if (number ==1){
            System.out.println("1 not a valid number"); 
        }
        else if (number ==2)
            System.out.println("Simple");   
        else{           
            for (int i=2; i<number;i++){
                if (number%i==0){
                    result=false;
                    break;
                    }
                else
                    result = true;

                }
            if (result)
                System.out.println("Simple");   
            else 
                System.out.println("not Simple");
        }   

    }

}
于 2013-02-04T20:42:05.827 に答える
0

3 は素数ですが、3 の倍数は素数ではなく、5 の場合も同様です。素数の倍数は素数ではありません。素数は非常に多くあります。素数を考案するための決定的な規則は開発されていません。素数 no は、集合 2n n 3n になく、それ自体と 1 だけで割り切れる数です。

于 2013-02-04T20:38:05.110 に答える