/*
*
* 求指定范围内的质数
* 质数:除了1和他本身外无别的因数
* 思路:1.用两个for循环将范围内的数全部验证一遍(缺点:速度慢,重复验证)
* 2.先把N个自然数按次序排列起来,1不是质数划去,第二个2是质数留下来,然后吧2后面的所有2的倍数划区,以此类推,留下来的就是质数。
*
* 一个数学原理:若小于根号m的数无法整除m,那大于根号m的数也不能整数m。(这个原理可以简化过程)
*
*/
package
com.zf.s3;
import
java.util.Arrays;
public class ZhiShu
{
private static boolean[] filterNumber(int num)
{
if(num<0)
{//输入是否合法
System.out.println("范围必须大于0");
return null;
}
boolean[] isPrime=new boolean[num+1]; //声明布尔类型数组,标注知否为数组,是就为ture,不是则为false。
isPrime[1]=false;
//1不是质数
Arrays.fill(isPrime,2,num+1,true); //将其他数置为ture
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;
}
public static void showAppointArea(int number) //显示指定范围的质数
{
boolean[] primes=filterNumber(number);
int num=0;
if(primes!=null)
{
for(int i=1;i<primes.length;++i)
if(primes[i])
{
System.out.print(i+" "); //输出质数
if(++num%10==0)
System.out.println(); //每输出十个质数换行
}
System.out.println();
}
System.out.println("一共有"+num+"个");
}
public static void main(String[] args)
{
int number =200;
System.out.println("范围在"+number+"内的质数有:");
showAppointArea(number);
}
}
运行结果
范围在200内的质数有:
2 3 5 7 11 13 17 19 23 29
31 37 41 43 47 53 59 61 67 71
73 79 83 89 97 101 103 107 109 113
127 131 137 139 149 151 157 163 167 173
179 181 191 193 197 199
一共有46个