58,442
社区成员
发帖
与我相关
我的任务
分享import java.util.*;
public class Shuzu{
public void showPrimeNumber(int range){
boolean[] primes = this.sieve(range);
int number = 0 ;
if(primes != null){
int size = primes.length;
System.out.println("范围在"+range+"内的质数个数有:");
for(int i = 1 ; i< size ; i++){
if(primes[i]){
System.out.print(i + " ");
if(++number %10 ==0){
System.out.println();
}
}
}
System.out.println();
}
System.out.println("一共有"+number+"个");
}
private boolean[] sieve(int range){
if(range <= 0 ){
System.out.println("求质数的范围range必须大于0!");
return null;
}
boolean[] isPrime = new boolean[range + 1];
isPrime[1] = false ;
Arrays.fill(isPrime, 2,range+1,true);
int n = (int)Math.sqrt(range);
for(int i = 1 ; i <= n ; i++){
if(isPrime[i]){
for(int j = 2 * i ;j <= range ; j+=i){
isPrime[j] = false;
}
}
}
return isPrime;
}
public static void main(String args[]){
int range = 0 ;
Shuzu test = new Shuzu();
test.showPrimeNumber(range);
}
}
for(int i = 1 ; i <= n ; i++){
if(isPrime[i]){
for(int j = 2 * i ;j <= range ; j+=i){
isPrime[j] = false;
}
}
}
这个就很好解释了,如果 i 是素数, 那么从 2i 开始,把所有i的倍数改为非素数。
如果 i 不是素数,那就以为这 i 是某个素数的倍数,所以 2i 也是,3i也是...所以,没有必要再修改了int n = (int)Math.sqrt(range);
获得最大值的平方根,循环只需要到 n 就行了, 原因如下:
假设 range = n1 * n2 那么 n1 和 n2 中必有一个 小于等于 n的。
也就是说,如果range可以分解,那么必有一个小于 sqrt(n) 的因子
boolean[] isPrime = new boolean[range + 1];
isPrime[1] = false ;
Arrays.fill(isPrime, 2,range+1,true);
这几行看的懂吧,就是分配长度为的 总数+1 boolean数组。注意多了一个,所以数组的第一个,也就是下标为0的元素没有用,现在计算机内存足够,所以经常为了程序更符合人们的思维,经常多分配一个元素,然后第一个不用
