为什么当我尝试打印所有小于10的质数时,数字4也随之打印?

时间:2018-11-03 02:16:34

标签: java primes

我正在尝试创建一个程序,该程序将所有素数加起来达到一定数量。在构建程序时,遇到了一个问题。每当我尝试打印所有低于10的质数时,它都会打印出它们,也打印出4。我不知道为什么我会打印出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

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

您打算测试小于等于(而不是小于),但是您可以通过展开第一个测试(除数为2)来改进算法。然后,您可以从三个开始,并在每次迭代时增加两个值(将运行时间减半)。我们可以通过停止在小于或等于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;
}

答案 2 :(得分:1)

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

i < potentialPrimeNumbeer / 2

对于i = 2potentialPrimeNumbeer = 4,这是2 < 2,这是错误的。因此,永远不会执行for循环,并且checkIfPrime()返回true