素数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
那么,对于任意数N,判断其是否是素数,就需要从[2,N) 一一枚举整除判断,若都不能整除,则N为素数。
public static boolean isprime(int num) {
if (num < 2) {
return false;
}
for (int i = 2; i < num; ++i) {
if (num % i == 0) {
return false;
}
}
return true;
}
缩减优化
在[2,N) 枚举过程,大于2的偶数,没有必要进行整除验证。那么只剩奇数集待验证。
public static boolean isprime(int num) {
if (num < 2 || (num > 2 && num % 2 == 0)) {
return false;
}
for (int i = 3; i < num; i += 2) {
if (num % i == 0) {
return false;
}
}
return true;
}
对称性优化
例如:判断12 是否是素数?
设 i 在 [2,12) i 在递增枚举过程:
12 = 2 * 6
12 = 3 * 4
12 = $\sqrt 12$ * $\sqrt 12$
12 = 4 * 3
12 = 6 * 2
从第三项,上下式具有对称性,所以从第三项以后没有必要枚举验证。只需要在[2,sqrt(12)]验证即可。
public static boolean isPrime(int num) {
if (num < 2 || (num > 2 && num % 2 == 0)) {
return false;
}
int i = 0;
for (i = 3; i * i <= num && num % i > 0; i += 2)
;
return i * i > num;
}