使用 toArray 查找 arraylist 的质数,打印错误
finding the prime numbers of an arraylist with toArray, prints wrong
我有一种使用 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;
}
不要介意最后一个 return 值,我添加它只是因为 BlueJ 要求我这样做。
任何人都可以帮助识别代码中的错误吗?
提前致谢!
for (int j = 2; j < i; j++) {
if (i % j == 0) {
isPrime = false;
break;
}
}
如果i=1
,(当minste=1时就是这种情况)将永远不会进入上述循环并且永远不会执行isPrime = false;
。因此,因为 i=1 被选为素数。
如果从 1 开始,minste
将为 1,代码永远不会进入第二个 for
循环,并且 isPrime
最终为 true
。
如果您已经知道不应该打印 1,则无需检查。相反,您可以使用 2
开始第一个 for
循环
这是因为下面的 for
循环:
for (int j = 2; j < i; j++) {
if (i % j == 0) {
isPrime = false;
break;
}
}
第一次,i
将为 1,这将使 j < i
条件 return 为假,因此,控制不会进入此 for 循环。
因此,isPrime
将为真,1
将被添加到列表中。为防止这种情况,您可以在随后的 if
条件中检查是否 i >= 2
,例如
if (isPrime && i >= 2) {
primtall = i;
primtallene.add(primtall);
}
此外,如果您不想 return
此方法的任何值,您可以将 return 类型更改为 void
并删除 return
语句。
我有一种使用 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;
}
不要介意最后一个 return 值,我添加它只是因为 BlueJ 要求我这样做。
任何人都可以帮助识别代码中的错误吗?
提前致谢!
for (int j = 2; j < i; j++) {
if (i % j == 0) {
isPrime = false;
break;
}
}
如果i=1
,(当minste=1时就是这种情况)将永远不会进入上述循环并且永远不会执行isPrime = false;
。因此,因为 i=1 被选为素数。
如果从 1 开始,minste
将为 1,代码永远不会进入第二个 for
循环,并且 isPrime
最终为 true
。
如果您已经知道不应该打印 1,则无需检查。相反,您可以使用 2
开始第一个for
循环
这是因为下面的 for
循环:
for (int j = 2; j < i; j++) {
if (i % j == 0) {
isPrime = false;
break;
}
}
第一次,i
将为 1,这将使 j < i
条件 return 为假,因此,控制不会进入此 for 循环。
因此,isPrime
将为真,1
将被添加到列表中。为防止这种情况,您可以在随后的 if
条件中检查是否 i >= 2
,例如
if (isPrime && i >= 2) {
primtall = i;
primtallene.add(primtall);
}
此外,如果您不想 return
此方法的任何值,您可以将 return 类型更改为 void
并删除 return
语句。