Ошибка с повторением, которую я не могу обнаружить

#java

#java

Вопрос:

Я пытаюсь разобраться с некоторым домашним заданием относительно «повторения» с помощью оператора while. Домашнее задание просит меня ввести число и указать, является ли указанное число простым. До сих пор я сталкивался с этим:

 class Prime {
    boolean esPrime(int n) {
        boolean prime = true;
        int divisor = 2;
        while (prime amp;amp; divisor != n) {
            if (n % divisor == 0) {
                prime = false;
            } else {
                divisor  ;
            }
        }

        return prime;
    }
}
  

Затем я ввел этот «логический тест» в метод main, чтобы проверить, сработал ли этот фрагмент кода:

 boolean testEsPrime = esPrime(2) == false;

public static void main(String[] args) {
    Prime p = new Prime();
    System.out.println("testEsPrime = "   p.testEsPrime);
}
  

И всякий раз, когда я ее запускаю, я получаю false и, похоже, не могу обнаружить ошибку. Есть какие-нибудь подсказки, почему это происходит?

Комментарии:

1. Как это могло быть скомпилировано?

2. Что происходит в коде при передаче 2 ? Выполняется ли цикл когда-либо? Кроме того, 2 является простым, поэтому esPrime(2) == false будет оцениваться как false .

3. Да, похоже, что она выполняется, но она всегда выдает мне false (с любым числом, которое я ввожу) спасибо!

4. @Darkkurama Для меня это нормально работает как есть (если не эффективно). Вы уверены, что делаете то, что думаете, что делаете? Ваша проверка не == false сбивает вас с толку?

5. Хорошо, я только что проверил, что у меня было. Я чувствую себя идиотом. Этот фрагмент кода является частью более длинного файла; Я полагаю, что я как-то запутался и поместил туда это false (я копирую и вставляю эти «тесты» просто для удобства и забыл его изменить). Большое вам всем спасибо! тьфу…

Ответ №1:

Это не самый эффективный код в мире, но у меня он работает (см. Ниже). Я не уверен, в чем здесь проблема! Кстати, вам нужно только протестировать 2 и нечетные множители с точностью до квадратного корня из того, что вы тестируете, и более эффективный подход в целом (для определения того, какие числа являются простыми в массе) — использовать сито Erastothenes (http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes ).

Причина, которую вы получаете false за выполняемый вами тест, заключается в том, что esPrime(2) == false это false — то есть, esPrime(2) == true .

 class Prime {
    boolean esPrime(int n) {
        boolean prime = true;
        int divisor = 2;
        while (prime amp;amp; divisor != n) {
            if (n % divisor == 0) {
                prime = false;
            }
            else {
                divisor  ;
            }
        }
        return prime;
    }

    public static void main(String[] args) {
        Prime p = new Prime();
        for(int i=2; i<10;   i) {
            System.out.println("esPrime("   i   ") = "   p.esPrime(i));
        }
    }
}
  

Вывод:

esPrime (2) = true
, esPrime (3) = true
, esPrime (4) = false
, esPrime (5) = true
, esPrime (6) = false
, esPrime (7) = true
, esPrime (8) = false
, esPrime (9) = false

Комментарии:

1. (Не по теме, но ИМО, поскольку код тот же, по крайней мере, используйте стиль фигурных скобок, который не растягивает его так надолго, если это вообще необходимо включить.)

2. @Dave: Код тот же, но также отформатирован в минимальный компилируемый пример. Но я могу переделать стиль фигурных скобок, если это вас беспокоит.

3. Просто треть кода — это потраченное впустую пространство, которое для подобного примера кажется чрезмерным. Тем более, что OP использовал (очевидно, превосходный;) стиль.

4. Лол, даже не заходи туда … 😉