Java 构造素数表的两种方法

构造一个含有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);
原文地址:https://www.cnblogs.com/oldfish123/p/13358306.html