在Java中使用函数实现判断一个数字是否为质数的方法?
发布时间:2023-06-13 20:01:27
1. 什么是质数?
质数是指除1和该数本身外,不能被任何整数整除的数。例如,2、3、5、7、11等皆为质数。
2. 判断一个数字是否为质数的方法
(1)暴力枚举法
暴力枚举法,即对于一个正整数n,从2到n-1枚举所有可能的因数,如果n能被其中任何一个整数整除,那么n就不是质数,否则n就是质数。
代码实现:
public static boolean isPrime(int n) {
if (n <= 1) {
return false;
}
for (int i = 2; i < n; i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
(2)优化枚举法
对于一个正整数n,如果它不是质数,那么一定存在一个小于等于n的因数k满足k*n,其中k和n之间必有一个小于等于sqrt(n)的因数,因此只需枚举2到sqrt(n)之间的整数即可。
代码实现:
public static boolean isPrime(int n) {
if (n <= 1) {
return false;
}
int sqrt = (int) Math.sqrt(n);
for (int i = 2; i <= sqrt; i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
(3)筛法
筛法是一种高效的判断质数的方法。具体思路是从2开始,将每个质数的倍数都标记为合数,直到遍历完2到n之间的所有数。那么此时没有被标记的数就是质数。
代码实现:
public static boolean isPrime(int n) {
if (n <= 1) {
return false;
}
boolean[] primes = new boolean[n + 1];
Arrays.fill(primes, true);
primes[0] = false;
primes[1] = false;
for (int i = 2; i * i <= n; i++) {
if (primes[i]) {
for (int j = i * i; j <= n; j += i) {
primes[j] = false;
}
}
}
return primes[n];
}
3. 性能比较
针对n在1到10000之间随机生成的100个数字,测试三种方法的性能。
public static void main(String[] args) {
Random random = new Random();
long start;
boolean result;
int[] nums = new int[100];
for (int i = 0; i < 100; i++) {
nums[i] = random.nextInt(10000) + 1;
}
start = System.currentTimeMillis();
for (int num : nums) {
result = isPrime1(num);
}
System.out.println("暴力枚举法:" + (System.currentTimeMillis() - start) + "ms");
start = System.currentTimeMillis();
for (int num : nums) {
result = isPrime2(num);
}
System.out.println("优化枚举法:" + (System.currentTimeMillis() - start) + "ms");
start = System.currentTimeMillis();
for (int num : nums) {
result = isPrime3(num);
}
System.out.println("筛法:" + (System.currentTimeMillis() - start) + "ms");
}
测试结果如下:
暴力枚举法:312ms
优化枚举法:33ms
筛法:3ms
可以看出,在n较大时,暴力枚举法的性能显著低于其他两种方法。而筛法在n比较小时,性能并不会比优化枚举法更优,但随着n的增大,筛法的优势逐渐显现。因此,在实际应用中,可根据具体情况选择相应的方法。
