public ArrayList Numbers(int upper, int lower)
{
ArrayList<Integer> primeNumbers = new ArrayList<Integer>();
boolean decider;
for(int x = lower; x <= upper; x++)
{
decider = true;
for(int y = 2; y < upper; y ++)
{
if(x % y == 0)
decider = false;
}
if(decider == true)
primeNumbers.add(x);
}
return primeNumbers;
}
我编写了以下代码来确定数字是否为素数。我的想法是,如果我将布尔值默认为true并且数字除以另一个数字的余数为0,则布尔值设置为false。
for(int x = lower; x <= upper; x++)
{
decider = true;
for(int y = 2; y < upper; y ++)
{
if(x % y == 0)
decider = false;
}
if(decider == true)
primeNumbers.add(x);
}
对于本节这一部分,这就是我试图做的事情。检查上限和下限之间的每个数字,以查看是否有任何除法的余数为0.如果是,则布尔值为false,并且不会将其添加到我的数组中。
由于某种原因,数组在上限和下限之间没有数字。我无法发现问题。还有其他人吗?
编辑 - 我在找到另一个错误后编辑了这篇文章,因为该程序从所有值返回到没有。
答案 0 :(得分:1)
这是我在您的代码中看到的逻辑问题。 for
中的内部y
循环将覆盖包含值x
的范围的大部分时间,因为循环的上限也是{{1} }}。所以,在大多数情况下,你实际上只计算一个可以被自身整除的数字作为非素数。您应该在到达目标upper
之前停止该循环。而且,如果你发现了一个除数,你可能会破裂。
x
这是一个演示,显示上述逻辑正常工作:
答案 1 :(得分:0)
问题是在扫描y时你写错了参数。 观察:
public ArrayList Numbers(int upper, int lower)
{
ArrayList<Integer> primeNumbers = new ArrayList<Integer>();
boolean decider;
for(int x = lower; x <= upper; x++)
{
decider = true;
for(int y = 2; y < x; y ++)
{
if(x % y == 0)
decider = false;
}
if(decider = true)
primeNumbers.add(x);
}
return primeNumbers;
}
当然,您可以通过将y的上限保持为sqrt(x)+ 1并将y的增量加2而不是1来改进代码。您需要分别检查数字2的基本情况。 / p>
答案 2 :(得分:0)
这就是问题所在:
for(int x = lower; x <= upper; x++)
当你迭代直到&lt; = upper时,它也会自动划分数字,并且会弄乱你的结果。
将其更改为“&lt;”它会工作;
public ArrayList Numbers(int upper, int lower)
{
ArrayList<Integer> primeNumbers = new ArrayList<Integer>();
boolean decider;
for(int x = lower; x < upper; x++)
{
decider = true;
for(int y = 2; y < upper; y ++)
{
if(x % y == 0)
decider = false;
}
if(decider == true)
primeNumbers.add(x);
}
return primeNumbers;
}