はじめに
転職の応募に際し、コーディング試験があるため、復習として素数判定プログラムを書いてみた。
ある自然数n
が素数であるかを判別します。
素数であればtrue
を、素数でなければfalse
を返します。
コード
public class Main {
public static void main(String[] args) {
System.out.println(isPrime(25)); // false
System.out.println(isPrime(31)); // true
System.out.println(isPrime(169)); // false
System.out.println(isPrime(167)); // true
}
public static boolean isPrime(int n) {
if (n == 1) {
return false;
}
if (n == 2) {
return true;
}
if (n % 2 == 0) {
return false;
}
int sqrt = (int) Math.sqrt(n);
if (n == sqrt*sqrt) {
return false;
}
for (int i = 3; i <= sqrt; i += 2) {
if (n % i == 0) {
return false;
}
}
return true;
}
}
解説
1
は素数ではないので、false
を返す。
if (n == 1) {
return false;
}
2
は素数なので、true
を返す。
if (n == 2) {
return true;
}
2
を除いた偶数は素数ではないので、false
を返す。
if (n % 2 == 0) {
return false;
}
数値n
が素数かどうかは、nの平方根
まで調べれば十分である。
nの平方根
が自然数のとき、素数ではないので、false
を返す。
int sqrt = (int) Math.sqrt(n);
if (n == sqrt*sqrt) {
return false;
}
2
より大きい偶数は素数ではないことはわかっているので、i
は3
から2ずつ増やして素数の判別を行う。
for (int i = 3; i <= sqrt; i += 2) {
if (n % i == 0) {
return false;
}
}
上記すべてに当てはまらなければ、true
を返す。
return true;
まとめ
計算量 $O(n^{1/2})$ で素数の判別ができる。