web-dev-qa-db-ja.com

isPrimeメソッドの何が問題になっていますか?

これは私のisPrimeメソッドです:

_private static boolean isPrime(int num) {
    if (num % 2 == 0) return false;
    for (int i = 3; i * i < num; i += 2)
        if (num % i == 0) return false;
    return true;
}
_

isPrime(9)を配置すると、trueが返されます。メソッドの何が問題になっていますか?

11
usama8800

条件はi * i <= numでなければなりません

private static boolean isPrime(int num) 
{
        if (num == 2) 
            return true;
        if (num < 2 || num % 2 == 0) 
            return false;
        for (int i = 3; i * i <= num; i += 2)
            if (num % i == 0) 
                return false;
        return true;
}

あなたは考慮に9番を取っていなかったので、9 <9は偽になります。ただし、9を確認する必要があります。

35
Tareq Salah

私のサンプル:

public boolean isPrime(int x) {
    if (x==1) {
        return true;
    } else {
        for(int i=2;i<=Math.sqrt(x);i++) {
            if (x%i==0) return false;          
    }
    return true;
}
5
K.Hayoev

Java 8:(ラムダ式とストリームの例)

public static boolean isPrimeFunctionalStyle(int number) {
    return number > 1 && 
            IntStream.rangeClosed(2, (int) Math.sqrt(number))
                .noneMatch(i -> number % i == 0);
}
3
d.danailov

(後期)サイドノード:

private static boolean isPrime(int num) {
    if (num % 2 == 0) return false;
    for (int i = 3; i * i < num; i += 2)
        if (num % i == 0) return false;
    return true;
}

このコードが欠落しています2; 2は素数です。 2で分割可能なものはすべて、2を除き、そうではありません。

private static boolean isPrime(int num) {
    if (num == 2) return true;
    if (num % 2 == 0) return false;
    for (int i = 3; i * i < num; i += 2)
        if (num % i == 0) return false;
    return true;
}
2
dognose

ヒントを次に示します。

  1. 主なバグは、ループ内のオフバイワンエラーのため、sqrt(num)による可分性をチェックしないことです。

  2. もう1つのバグは、2素数である(これが)。

2
NPE

このようにコードを変更します(条件を確認します):

 private static boolean isPrime(int num) {
        if (num == 2) return true;
        if (num % 2 == 0)
            return false;
        for (int i = 3; i * i <= num; i += 2)
            if (num % i == 0) return false;
        return true;
  }  
2
Sujith PS
 for (int i = 3; i * i < num; i += 2)
        if (num % i == 0) return false;

i * iは9であり、9以上で9であるため、forループは実行されません。

0
Student

ifおよびelseステートメントを使用して、数値が素数かどうかを確認できます。パターンがあります。番号が特定の制限に達すると、すべての番号は2または3の倍数になります。

public static boolean isPrime2 (int n)
{
    if (n == 1) {
        return false;
    } else if (n == 2 || n==3) {
        return true;
    } else if (n>2) {
        if(n % 2 ==0 || n % 3 == 0) {
            return false;
        }
    }
    return true;
}
0
Benjamin Zheng
public static boolean isPrime (int number) {
    if(number < 2) {
        return false;
    }
    int check = (int) Math.sqrt(number);


    for(int i = 2; i <= check; i++) {
        if(number % i == 0) {
            return false;
        }
    }
    return true;
}
0
Ankush

i * i < numのループ条件はi * i <= numでなければなりません

0
LynxZh

ループは実行されないため、直接trueを返します

0
JosefN

ループは実行されません。 3 x 3 = 9は条件i * i <nを満たさないため、iの最初の値で終了します。

0