Почему, когда я пытаюсь напечатать все простые числа ниже 10, число 4 также напечатано с ними? - PullRequest
0 голосов
/ 03 ноября 2018

Я пытаюсь создать программу, которая складывает все простые числа до определенной суммы. Когда я строил свою программу, я столкнулся с проблемой. Всякий раз, когда я пытаюсь напечатать все простые числа ниже 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 голосов
/ 03 ноября 2018
for (int i = 2; i <= potentialPrimeNumbeer / 2; i++) 

больше или равно будет работать, потому что теперь вы войдете в цикл. В противном случае все условия цикла не выполняются, он не входит в цикл и возвращается значение True.

0 голосов
/ 03 ноября 2018

Вы имели в виду тестирование меньше чем равно (не просто меньше), однако вы можете улучшить свой алгоритм, развернув первый тест (деление на два). Затем вы можете начать с трех и увеличить на два значения на каждой итерации (вдвое сократив время выполнения). Мы можем дополнительно оптимизировать его, остановившись на значениях, меньших или равных квадратному корню из 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;
}
0 голосов
/ 03 ноября 2018

В checkIfPrime() for -петл имеет условие

i < potentialPrimeNumbeer / 2

С i = 2 и potentialPrimeNumbeer = 4 это 2 < 2, что неверно. Следовательно, for -loop никогда не выполняется и checkIfPrime() возвращает true.

...