构造一个含有50个素数的素数表,当下一次出现数字需要判断是否为素数的时候,就可以直接在素数表中用二分查找法寻找是否为素数了。
public static void main(String[] args) { int[] a=new int[50];//new一个专门存放素数的数组 a[0]=2;//这个素数的第一个数是2 int cnt=1;//这个表有了第一个素数2,从1开始计数,一共数50个数 int number=3;//从3开始检验数字,查看是否是素数 MAIN_LOOP://goto语句 for(;cnt<10;number++)//从3开始数起,一共需要找到50个素数 { for(int j=0;j<cnt;j++)//从素数表的第一个素数开始数起,一直到当前素数表的最大个数 if(number%a[j]==0)//查看当前的数字能否整除素数表中的数字,如若可以,则当前数字不是素数 continue MAIN_LOOP;//发现当前数字不是素数,返回第一层循环:检验下一个数字是不是素数 a[cnt++]=number;//若当前数字通过检测为素数,则添加到素数表当中 } for(int k:a)//for each循环打印当前素数表 { System.out.println(k); } }
第二种方法就是找倍数法,一个素数x的2倍、3倍、4倍......一定全是非素数
那么就定义一个长度为N的布尔数组(目的是寻找2~N种有多少素数),现将所有数全部定为素数:
举例:从2开始数起:2的2倍=4,3倍=6,4倍=8,一直到2*x倍<=N为止的全部数必定都是非素数
从3开始,6,9,12,15必定为非素数
4已经被定为非素数,不用管
5的倍数10,15,20,25.....全部为非素数
.......
public static void main(String[] args) {//寻找100以内的素数 boolean[] isPrime=new boolean[100];//定义一个长度为100的布尔数组,默认数字1~100全部为素数 for(int i=2;i<isPrime.length;i++)//由于new的数组数值全为0==false isPrime[i]=true;//需要把数组转变为true数组,由于0,1不是素数,所以从2开始转为true for(int i=2;i<isPrime.length;i++)//从数字2开始检验,一直到100为止 if(isPrime[i])//如果当前的这个数字是素数的话 for(int j=2;i*j<isPrime.length;j++)//找出这个数字的2倍,3倍,4倍....直到这个倍数的数字达到100为止 isPrime[i*j]=false;//将这个数字的所有倍数全部定位非素数 for(int i=0;i<isPrime.length;i++) if(isPrime[i]) System.out.println(i);