求一亿以内的质数

引言

质数是指只能被1和自身整除的自然数,是数论中的重要概念。在计算机领域中,求一亿以内的质数是一个常见的算法问题。本文将介绍如何使用Java编写算法来求解一亿以内的质数,并通过代码示例来演示。

质数判断算法

质数判断算法是求一亿以内的质数的基础。一种常见的算法是试除法,即对于每个待判断的数n,从2开始逐个试除,直到n的平方根。如果n能被2到根号n之间的任意数整除,则n不是质数;否则,n是质数。

以下是使用Java编写的质数判断算法的代码示例:

public static boolean isPrime(int n) {
    if (n < 2) {
        return false;
    }
    for (int i = 2; i <= Math.sqrt(n); i++) {
        if (n % i == 0) {
            return false;
        }
    }
    return true;
}

上述代码中的isPrime方法接受一个整数n作为参数,返回一个布尔值,表示n是否为质数。该方法首先判断n是否小于2,如果是则返回false,因为质数定义中不包括1和0。然后使用循环从2到n的平方根逐个试除,如果n能被整除,则返回false,否则返回true

求一亿以内的质数

在了解了质数判断算法后,我们可以使用该算法来求解一亿以内的质数。一种常见的方法是遍历法,即从2开始逐个判断每个数是否为质数,并将质数存储起来。

以下是使用Java编写的求一亿以内的质数的代码示例:

public static List<Integer> findPrimes(int limit) {
    List<Integer> primes = new ArrayList<>();
    for (int i = 2; i <= limit; i++) {
        if (isPrime(i)) {
            primes.add(i);
        }
    }
    return primes;
}

上述代码中的findPrimes方法接受一个整数limit作为参数,返回一个列表,包含从2到limit之间的所有质数。该方法使用循环从2到limit逐个判断每个数是否为质数,如果是则将其添加到列表中。

性能优化

上述的遍历法求一亿以内的质数的算法是简单有效的,但是在求解大范围的质数时可能效率较低。因此,我们可以通过埃拉托斯特尼筛法进行性能优化。

埃拉托斯特尼筛法是一种基于排除法的质数筛选算法,其基本思想是从2开始,将其所有的倍数标记为非质数,然后再找到下一个未被标记的数,重复上述步骤,直到找到的数的平方大于给定范围。剩下未被标记的数即为质数。

以下是使用Java编写的使用埃拉托斯特尼筛法求一亿以内的质数的代码示例:

public static List<Integer> sieveOfEratosthenes(int limit) {
    boolean[] isPrime = new boolean[limit + 1];
    Arrays.fill(isPrime, true);
    List<Integer> primes = new ArrayList<>();

    for (int i = 2; i <= Math.sqrt(limit); i++) {
        if (isPrime[i]) {
            for (int j = i * i; j <= limit; j += i) {
                isPrime[j] = false;
            }
        }
    }

    for (int i = 2; i <= limit; i++) {
        if (isPrime[i]) {
            primes.add(i);
        }
    }

    return primes;
}

上述代码中的sieveOfEratosthenes方法接受一个整数limit作为参数,返回一个列表,包含从2到limit之间的所有质数。该方法首先创建