これは私の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
が返されます。メソッドの何が問題になっていますか?
条件は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を確認する必要があります。
私のサンプル:
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;
}
Java 8:(ラムダ式とストリームの例)
public static boolean isPrimeFunctionalStyle(int number) {
return number > 1 &&
IntStream.rangeClosed(2, (int) Math.sqrt(number))
.noneMatch(i -> number % i == 0);
}
(後期)サイドノード:
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;
}
ヒントを次に示します。
主なバグは、ループ内のオフバイワンエラーのため、sqrt(num)
による可分性をチェックしないことです。
もう1つのバグは、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;
}
for (int i = 3; i * i < num; i += 2)
if (num % i == 0) return false;
i * i
は9であり、9以上で9であるため、forループは実行されません。
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;
}
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;
}
i * i < num
のループ条件はi * i <= num
でなければなりません
ループは実行されないため、直接trueを返します
ループは実行されません。 3 x 3 = 9は条件i * i <nを満たさないため、iの最初の値で終了します。