欢迎访问宙启技术站
智能推送

在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的增大,筛法的优势逐渐显现。因此,在实际应用中,可根据具体情况选择相应的方法。