这是识别指定数字的素数的代码。如果你输入,比方说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中数字的平方。
我想知道这是如何实现其目标的。请帮我理解这一点。
答案 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,应该早点被抓住了)