0

我有一种使用 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 要求我这样做。

任何人都可以帮助识别代码中的错误吗?

提前致谢!

4

3 回答 3

0
for (int j = 2; j < i; j++) {
            if (i % j == 0) { 
                isPrime = false;
                break;
            }
        }

if i=1,(当 minste=1 时就是这种情况)上面的循环永远不会进入isPrime = false;也永远不会被执行。因此,因为 i=1 被选为素数。

于 2017-03-05T14:11:03.717 回答
0

如果你从 1 开始,minste将会是 1 并且代码永远不会进入第二个for循环,isPrime最终是true.

如果您已经知道不应该打印 1,则无需检查它。相反,您可以使用 2 开始第一个for循环

于 2017-03-05T14:11:12.420 回答
0

这是因为下面的for循环:

for (int j = 2; j < i; j++) {
    if (i % j == 0) { 
        isPrime = false;
        break;
    }
}

第一次,i将是 1,这将使j < i条件返回 false,因此,控制不会进入这个 for 循环。

因此,isPrime将是真实的,1并将被添加到列表中。为了防止这种情况,您可以检查是否i >= 2在后续if条件下,例如

if (isPrime && i >= 2) {
    primtall = i;
    primtallene.add(primtall);
}

此外,如果您不想return从此方法中获取任何值,则可以将返回类型更改为void并删除return语句。

于 2017-03-05T14:14:29.107 回答