这下面的代码如何识别素数

时间:2014-06-21 11:22:30

标签: java primes

这是识别指定数字的素数的代码。如果你输入,比方说7,返回的ArrayList将包含所有前7个素数。

    public static ArrayList<Integer> calcPrime(int inp) 
    {
        ArrayList<Integer> arr = new ArrayList<Integer>();
        arr.add(2);
        arr.add(3);

        int counter = 4;

        while(arr.size() < inp) 
        {
            // 23 and 25
            if(counter % 2 != 0 && counter%3 != 0) 
            {
                int temp = 4;
                while(temp*temp <= counter) 
                {
                    if(counter % temp == 0)
                        break;
                    temp ++;
                }
                if(temp*temp > counter) 
                {
                    arr.add(counter);
                }
            }
            counter++;
        }

        return arr;
    }

我的问题是这个。据我所知,这段代码过滤了所有可以被2和3整除的数字。但对于所有其他数字,比如23或25,它只是依赖于4中数字的平方。

我想知道这是如何实现其目标的。请帮我理解这一点。

2 个答案:

答案 0 :(得分:2)

进行检查的位是:

                if(counter % temp == 0)
                    break;

它实际上根本不依赖于数字的平方。这只是告诉它何时停止检查数字。

首先它做了一些初始设置。它知道2和3是素数,因此它将它们添加到列表中。

然后,从4开始,它检查数字是否为素数。如果是,则将其添加到数组中,如果它不跳过并检查下一个数字。

所以&#34;检查数字是否为素数&#34;由以下人员完成: 首先检查它是否可被2整除或可被3整除:

    if(counter % 2 != 0 && counter%3 != 0) 

然后,再次从4开始,进行相同的检查:我的潜在素数(counter)是否可被此数字整除(temp)?

        if(counter % temp == 0)

如果是这种情况,那么它不是素数,因此它执行break命令并检查下一个counter以查看是否为素数。

如果counter无法被temp整除,则会递增temp并再次检查。如果temp如此之大,则不值得检查它是否是一个因素,算法知道counter是素数,并将其添加到列表中。

temp*temp位是因为当它检查数字是否为素数时,它不必检查最多counter的所有数字。如果temp*temp大于我们的目标,那么temp是一个因素,另一个因素必须小于temp,并且已经过检查。

答案 1 :(得分:0)

%表示除以时的余数,并且是执行实际工作的片段。如果余数为零,则它完全分开,因此数字不是素数。

方形部分是因为你可以通过仅考虑小于平方根的数字来优化一个位(因为如果一个数字大于平方根除数,那么结果 less 比平方root,应该早点被抓住了)