JAVA实现埃式筛查找一定数内的素数
前言:在先前的c语言学习中学到过判断素数的办法,除了运用素数只能和1与本身进行相除的原理外,还从老师那里学习到埃式筛法判断素数。在初学java的过程中,我想着在java语言中实现埃式筛。
1.原理
何为埃式筛?假设我们要寻找n以内的素数,从2开始逐步向n递增,2是最小的素数,随后给2的倍数(倍数大于1)作上标记。然后就到了3,同样将3的倍数(倍数均大于1)作上标记,接着递增到4。随后均是这样的过程,通过这样的操作,就能一次枚举n以内的素数。
2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | |
---|---|---|---|---|---|---|---|---|---|
当为2时 | 2 | 3 | / | 5 | / | 7 | / | 9 | / |
当为3时 | 2 | 3 | / | 5 | / | 7 | / | / | / |
当为4时 | 2 | 3 | / | 5 | / | 7 | / | / | / |
通过这个图,我们可以看到当为4时,4以内的素数已被全部找出。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int maxNum = Integer.MAX_VALUE;///获取int类型的最大值
Scanner x1=new Scanner(System.in);
int num;要输入的数字
int j=2;
num = x1.nextInt();
boolean shuZu[] = new boolean[maxNum/10];///创建布尔类型的数组用来标记倍数
for(int i=2;i<=num;i++){
shuZu[i]=true;
}
shuZu[0]=shuZu[1]=false;
for(int i=2;i<=num;i++){
if(shuZu[i]!=false){
for(j=i*2;j<=num;j+=i){
shuZu[j]=false;
}
}
if(shuZu[i]!=false){
System.out.println(i);
}
}
}
}
功能实现的代码:
for(int i=2;i<=num;i++){//先将布尔类型的数组全部赋成true
shuZu[i]=true;
}
shuZu[0]=shuZu[1]=false;/0与1不是素数
for(int i=2;i<=num;i++){///从2开始遍历
if(shuZu[i]!=false){减少运算量的判断语句,用于判断是否是被标记的倍数
for(j=i*2;j<=num;j+=i){///j必须初始化为i*2,如果为j=i会将素数本身标记。
shuZu[j]=false;///标记倍数
}
}
}