素数查找器错误 - 显示非素数作为素数

时间:2015-02-20 18:38:37

标签: java algorithm primes

我一直在解决项目euler的问题,而不是使用暴力,我想用质量解决方案来解决问题。我建立了这个以找到素数,并且一直在测试它的价值。当我寻找第12个素数时,它会告诉我它的35(显然不是)。

它应该将35识别为不是素数,因为所有先前的素数都被添加到列表中,但这里出现了问题。有什么想法吗?

public static void main (String[] args) {
    int nthTerm = 12;
    int count = 3;
    int nPrime = 3;
    ArrayList<Integer> primeList = new ArrayList<>();
    primeList.add(3);
    int upperBoundary;
    ArrayList<Integer> checkList = new ArrayList<>();
    int check;
    boolean isPrime;

    while (count < nthTerm) {
        isPrime = false;
        nPrime += 2;

        for (int i = 0; i < primeList.size(); i++){
            upperBoundary = (int) Math.floor(Math.sqrt(nPrime));
            if (primeList.get(i) <= upperBoundary){
                checkList.add(primeList.get(i));
            }
        }

        for (int j = 0; j < checkList.size(); j++){
            check = checkList.get(j);
            if (nPrime % check == 0){
                isPrime = false;
                break;
            } else {
                isPrime = true;
                primeList.add(nPrime);
            }
        }

        if (isPrime == true) {
            count++;
        }

    }
    System.out.println("Prime number " + count + ": " + nPrime);

}

}

2 个答案:

答案 0 :(得分:1)

首先,您不需要在第一个for循环中重新计算upperBoundary。该值在该循环的每次迭代中都没有变化,因此只需在while循环中计算它。

其次,对于nPrime的低值,您不会向checkList添加任何内容。这是根本问题。值5永远不会添加到该列表中,因此25和35都被标识为素数。

最后,您应该通过在调试器中运行代码来调试代码,或者至少在中间步骤中打印出一些值。查看算法中标识为素数的所有值以及checkList变量中的值,可以引导您找到解决方案。

(另外,在这里发布问题时,这将有助于解释您的方法。如果有解释它的尝试,可以更容易理解代码出错的地方。)

答案 1 :(得分:0)

试试这个:

public static void main(String[] args) {
    int nthTerm = 12;
    int nPrime = 3;
    List<Integer> primeList = new ArrayList<>();
    primeList.add(2);
    primeList.add(3);

    while (primeList.size() < nthTerm) {
        nPrime += 2;

        boolean isPrime = true;
        for (int primeIndex = 1; primeIndex < primeList.size(); primeIndex++) {
            int prime = primeList.get(primeIndex);
            if (nPrime % prime == 0) {
                isPrime = false;
                break;
            }
        }
        if (isPrime) {
            primeList.add(nPrime);
            System.out.println("Prime number " + primeList.size() + ": " + nPrime);
        }

    }

    System.out.println("Prime number " + nthTerm + ": " + nPrime);

}

您的代码存在问题:

  • 您在列表中添加非素数,例如25.仅因为25%3 == 1(如果不是素数加上,则加入 - 不检查ALL)
  • 清单从未清除 - 它可以包含多个元素,如:3,3,3,3,5 ......