我有一种使用ArrayList和toArray从数字列表中查找素数的方法。大多数代码都有效,除了当我打印参数1和10时,它打印1,2,3,5,7。因此它打印1到10之间的素数,但它也打印1.我认为错误是在第一个或第二个for循环中,但我不确定。
public int primtall(int a, int b) {
ArrayList<Integer> primtallene = new ArrayList<>();
int primtall = 0;
int største;
int minste;
if(a == b){
primtall = 0;
}
else {
if(a > b) {
største = a;
minste = b;
}
else if (a < b){
minste = a;
største = b;
for(int i = minste; i <= største; i++) {
boolean isPrime = true;
for (int j = 2; j < i; j++) {
if (i % j == 0) {
isPrime = false;
break;
}
}
if (isPrime) {
primtall = i;
primtallene.add(primtall);
}
}
}
}
Integer[] numrene = new Integer[primtallene.size()];
numrene = primtallene.toArray(numrene);
for(Integer nummer : numrene){
System.out.println("Primtall = " + nummer);
}
return 0;
}
不介意最后一个返回值,我只补充说因为BlueJ要求我。
任何人都可以帮助识别代码中的错误吗?
提前致谢!
答案 0 :(得分:0)
for (int j = 2; j < i; j++) {
if (i % j == 0) {
isPrime = false;
break;
}
}
如果i=1
,(当minste = 1时就是这种情况),将永远不会输入上述循环,并且永远不会执行isPrime = false;
。因此,因为i = 1被选为素数。
答案 1 :(得分:0)
如果您从1开头,则minste
将为1,代码永远不会进入第二个for
循环,isPrime
最终为true
。
如果您已经知道不应该打印1,则无需进行检查。相反,您可以使用2
启动第一个for
循环
答案 2 :(得分:0)
这是因为下面的for
循环:
for (int j = 2; j < i; j++) {
if (i % j == 0) {
isPrime = false;
break;
}
}
第一次,i
将为1,这会使j < i
条件返回false,因此,控件不会进入此for循环。
因此,isPrime
将为true,1
将添加到列表中。为防止出现这种情况,您只需检查后续i >= 2
条件中是if
,例如
if (isPrime && i >= 2) {
primtall = i;
primtallene.add(primtall);
}
此外,如果您不想return
此方法中的任何值,您可以将返回类型更改为void
并删除return
语句。