用toArray找到一个arraylist的素数,打印错误

时间:2017-03-05 14:00:59

标签: java if-statement for-loop arraylist toarray

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

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

提前致谢!

3 个答案:

答案 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语句。