版权声明:DY https://blog.csdn.net/Atishoo_13/article/details/82982563
求出指定范围内所有的质数
1.要求
在窗口输出指定范围内所有的质数,并对所有输出的质数个数进行计数。
2.质数
在所有比1大的整数中,除了1和它本身以外,不再有别的因数,这种整数叫做质数或素数。还可以说成质数只有1和它本身两个约数。
3.原理
具体做法是:先把N个自然数按次序排序起来。1不是质数,也不是合数,要划去。第二个数是质数留下来,而把2后面的所有能被2整除的数都划去。2后面第一个没划去的数是3,把3留下,再把3后面所有能被3整除的数都划去。3后面第一个没划去的数是5,把5留下,再把5后面所有能被5整除的数都划去。这样一直做下去,就会把不超过N的全部合数都删掉,留下的就是不超过N的全部质数。
4.语法
- filterNumber()方法使用筛选法求传入参数值范围内的所有的质数。声明一个布尔类型的数组,数组元素的值为true时,表示该元素的下标为质数。如果number是一个质数,那么number的位数都不是质数,利用Array.fill()方法初始化布尔类型数组,然后利用循环将数组下标为number的倍数元素值设置为false。这样就能判断哪部分元素是质数了。
- ShowAppointArea()方法调用FilterNumber()方法,得到布尔类型数组,将值为true的元素的下标在控制台输出。
5.代码
import java.util.Arrays;
public class rw31 {
public static void main(String[] args) {
//JAVA主程序入口
// TODO Auto-generated method stub
int number=300; //对范围进行设置
System.out.println("范围在"+number+"内的质数有:");
showAppointArea(number); //调用方法显示质数
}
public static void showAppointArea(int number) {
//显示指定范围内的质数
// TODO Auto-generated method stub
boolean[]primes=FilterNumber(number);//调用方法赋值给布尔类型的数组
int num=0;
if(primes!=null){
for(int i=1;i<primes.length;i++){ //循环数组操作数组的元素
if(primes[i]){
//如果数组元素值为true,则下标值为质数
System.out.print(i+" ");//输出质数
if(++num%10==0)//每输出十个质数后进行换行
System.out.println();
}
}
System.out.println("\n(一共有"+num+"个)");
}
}
private static boolean[] FilterNumber(int num) {
//筛选法求质数
// TODO Auto-generated method stub
if(num<=0){ //判断指定的范围
System.out.println("范围必须大于0");
return null;
}
boolean[]isPrime=new boolean[num+1];
//申明布尔类型数组,长度为范围+1
//数组标注是否为质数,下标值为质数,那么对应数组元素值为true
//例如2是质数,isPrime[2]=true
isPrime[1]=false;//1不是质数
Arrays.fill(isPrime, 2,num+1,true);//将布尔数组元素的值都赋为true
int n=(int)Math.sqrt(num); //Math.sqrt方法用于求开方
for(int i=1;i<n;i++){
if(isPrime[i]){ //如果是质数,那么i的倍数不是质数
for(int j=2*i;j<=num;j+=i){
isPrime[j]=false;
}
}
}
return isPrime;
}
}
6.结果
编译结果如下图所示:
运行结果如下图所示: