求一亿以内的质数
引言
质数是指只能被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之间的所有质数。该方法首先创建