一个质数(Prime number)是只能被1和自身整除的正整数。要判断一个数n是否是质数,我们可以:
- 找出n的所有因子(除了1和n之外的数),看其中的因子是否超过2个。如果超过2个,则n不是质数。
- 由于质数的定义,我们只需要考虑从2到根号n之间的因子。因为如果n可以被a整除,那么n也可以被n/a整除。
- 每找到一个因子,我们就可以提前返回false。只有在试到根号n都没有找到额外的因子,我们才能确定n是质数,返回true。
例如,判断23是否是质数:
- 2不能整除23
- 3也不能整除23
- …
- 7不能整除23
- 到了根号23(约等于4.795)仍未找到额外因子,所以23是质数,返回true
这里是Java实现:
public boolean isPrime(int n) {
if (n <= 1) return false; // 1不是质数
if (n == 2) return true; // 2是唯一的偶质数
for (int i = 2; i <= Math.sqrt(n); i++) {
if (n % i == 0) {
return false; // 找到因子,不是质数
}
}
return true;
}
这个方法先过滤掉1和2的特殊情况。然后从2开始遍历到根号n,每找到一个因子就直接返回false。如果试到根号n都未找到因子,则返回true。
例如isPrime(23)的过程是:
- i = 2, 23 % 2 != 0
- i = 3, 23 % 3 != 0
… - i = 7, 23 % 7 != 0
- 遍历结束,返回true, 23是质数
所以这个方法利用了质数定义的性质,高效地判断一个数是否为质数,时间复杂度为O(根号n)。