#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. Лол, даже не заходи туда … 😉