为什么当我尝试打印所有小于 10 的素数时,数字 4 也会被打印出来?

Why when I try to print all prime numbers below 10 the number 4 is also printed with them?

我正在尝试创建一个程序,将所有素数加起来达到一定数量。在构建程序时,我遇到了一个问题。每当我尝试打印所有小于 10 的质数时,它都会打印出来,而且 4.I 也无法弄清楚为什么要打印 4。你们能帮我解决这个问题吗?

我的代码在这里:

private static boolean isPrime = false;
private static int sum = 0;

public static void main(String[] args) {
    addPrimeNumbers();
}


private static void addPrimeNumbers(){
    for(int n = 2; n < 10; n++){
        if(checkIfPrime(n)){
            System.out.println(n); // here it prints out all odds numbers below 10 and 4 
            sum += n;
        }
    }
}

private static boolean checkIfPrime(int potentialPrimeNumbeer) {
    for (int i = 2; i < potentialPrimeNumbeer / 2; i++) {
        if (potentialPrimeNumbeer % i == 0) {
            return false;
        }
    }
    return true;
}

输出:

2
3
4
5
7

checkIfPrime() 中,for 循环具有条件

i < potentialPrimeNumbeer / 2

i = 2potentialPrimeNumbeer = 4 这是 2 < 2,这是错误的。因此 for-loop 永远不会执行并且 checkIfPrime() returns true.

for (int i = 2; i <= potentialPrimeNumbeer / 2; i++) 

大于或等于将起作用,因为现在您将进入循环。否则所有for循环条件都不满足,不进入循环,返回True。

您打算测试小于等于(不仅仅是小于),但是您可以通过展开第一个测试(被二整除)来改进您的算法。然后你可以从三个开始,每次迭代增加两个值(将你的运行时间减半)。我们可以通过停止在小于或等于 potentialPrimeNumber 的平方根的值来进一步优化它——这进一步减少了测试用例的数量。剩下的,

private static boolean checkIfPrime(int potentialPrimeNumber) {
    if (potentialPrimeNumber == 2) {
        return true;
    }
    if (potentialPrimeNumber % 2 == 0) {
        return false;
    }
    for (int i = 3; i <= Math.sqrt(potentialPrimeNumber); i += 2) {
        if (potentialPrimeNumber % i == 0) {
            return false;
        }
    }
    return true;
}