Ошибка в вычислении простых чисел - PullRequest
0 голосов
/ 01 июля 2019

Я пытаюсь напечатать все простые числа от 2 до 100, но получаю только 2 и 3.

Я перепробовал все возможные альтернативы, и он выдал другую ошибку или другой вывод.

public static void main(String[] args) {
    boolean flag = true;
    for (int i = 2; i <= 100; i++) {
        for (int j = 2; j < i; j++) {
            if (i % j == 0) {
                flag = false;
                break;
            }
        }

        if (flag) {
            System.out.println(i);
        }
    }
}

Мне не нужен альтернативный способ, я просто хочу знать, что происходит в моем коде и почему он дает только 2 и 3?

Ответы [ 3 ]

1 голос
/ 01 июля 2019

Объяснение

Вы устанавливаете свой флаг на false, как только вы попали в первое не простое число, но вы забыли сбросить его для следующего запуска .

Таким образом, после нажатия 4 , который не является простым, это false, а остается ложным .


Решение

Вы можете исправить это, просто добавив flag = true; в начало вашего внешнего цикла. Поскольку флаг необходим только внутри цикла, вы также можете просто определить его прямо там:

public static void main(String[] args) {
    for (int i = 2; i <= 100; i++) {
        boolean flag = true; // "Resetting" the flag here
        for (int j = 2; j < i; j++) {
            if (i % j == 0) {
                flag = false;
                break;
            }
        }

        if (flag) {
            System.out.println(i);
        }
    }
}

Примечания

Имя переменной flag - довольно плохое имя, как насчет isPrime. Это было бы довольно идиоматично.

Это также может улучшить читабельность, если вы переместите чек в специальный метод:

public static boolean isPrime(int number) {
    for (int j = 2; j < number; j++) {
        if (number % j == 0) {
            return false;
        }
    }
    return true;
}

А затем используйте это так:

for (int i = 2; i <= 100; i++) {
    if (isPrime(i)) {
        System.out.println(i);
    }
}
0 голосов
/ 01 июля 2019

Вам просто нужно установить флаг в true после внутреннего цикла. Или же условие if (flag) не пройдет после того, как первый раз этот флаг будет установлен в false. Если для флага установлено значение false, он выходит из цикла или в противном случае устанавливается значение true.

public static void main(String[] args) {
    for (int i = 2; i <= 100; i++) {
        boolean flag=true; // <---- Here
        for (int j = 2; j < i; j++) {
            if (i % j == 0) {
                flag = false;
                break;
            }
        }

        if (flag) {
            System.out.println(i);
        }
    }
}
0 голосов
/ 01 июля 2019

Вам необходимо сбросить flag обратно на true.Попробуйте это:

                if (i % j == 0) {
                    flag = false;
                    break;
                } else {
                    flag = true;
                }

Это дало мне вывод почти до 100.

...