Реферат: Попытка изучить альтернативные способы ведения дел. Часть Java, которую я понимаю наименее, - это то, как каждая часть кода взаимодействует друг с другом. Таким образом, вместо использования вызова метода в классическом isPrime для генерации цикла, я пытаюсь сделать это с использованием только вложенных циклов. Тем не менее, самое близкое, что я получил, это увеличить его на 2 до 100 - он не проверяет, является ли он простым. Я предоставил образец кода, но я не уверен, почему мой код не работает должным образом. Если возможно, исправьте мой пример кода и объясните свои исправления.Использование цикла inested for для проверки того, являются ли цифры первыми; и если да, добавьте их в набор - БЕЗ использования метода для isPrime
То, что я пытаюсь сделать: добавить все простые числа 2 -> 100 в набор A (2 был добавлен перед началом)
Ожидаемое: 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31 ... Актуально: ... 5,7,9,11,13,15,17 ... (+ = 2 до 99)
Почему этот код рассчитывается только на 2, вместо того, чтобы использовать условие, которое я указал?
Моя логика:
- подготовить все (создать материал, добавить 2 установить)
- условие addNumber - если это правда, добавить, что к набору, если нет, то перейти к следующему номеру
- внешняя петля - n - число проверяется. начинаются с 3, Приращение на 2 секунды (без четных чисел будет простым), до 100
- внутренний цикл - диапазон i - "i -> n" используется для проверки, является ли простой. если п делится на I, число которых не является простым
- , если число не было установлено нарушение п% I == 0, добавить его к вектору
- , если оно было установлено, что нарушает условия, выход внутренней петля и переместиться на следующее число
Не понимаю, зачем ломаться; не работает, как я предполагаю. Я не понимаю, почему, даже если перерыв каким-то образом не сработает, я указываю, что условие завершения не работает. Я не понимаю, почему мне кажется, что мой чек никогда не достигнут, и он просто добавляет каждые 2 числа ...
То, что я пробовал: играл с перерывами и окончаниями. Перемещались внутри и снаружи частей вложенных циклов.
Все, что я могу получить, чтобы произошло это для того, чтобы рассчитывать на 2, или для того, чтобы добавить до 7, а затем остановиться на первом значении оно не должно добавить (9)
Research Я сделано:
Breaking out of nested loops in Java
Why do we check up to the square root of a prime number to determine if it is prime?
идеальным ответом будет б e пример кода с исправлением моего кода и объяснением. Я пытаюсь сделать это БЕЗ использования метода isPrime, логика этого метода должна находиться внутри цикла, который добавляет номер.
public static void main(String[] args) {
boolean addNumber = true;
for (int n = 3; n < 100; n = n+2) { //outer loop -- argument
for(int i=2; i< n; i++){ //check if 2-->n is a divisor
if (n % i == 0){ //if it's NOT prime
addNumber = false; //set condition to FALSE
i=n+1; //ensure that inner loop break condition is met
break; //literally tell it to break
}
else {
i=n+1;
break; //if the above is not met, ensure that the inner loop is broken
}
}//closes inner loop
//before exiting loop, add the confirmed prime number to set
if(addNumber) //if we should add it
A.append(n); //add it
}//closes outer loop
System.out.println(A);
}
EDIT: Получается, используя «break;» вот только вопрос эффективность. Как только мы определим, что n не является простым числом, зачем продолжать выполнение всех оставшихся значений i? Я продолжал играть с этой темой и придумал сценарий, в котором на самом деле необходим перерыв.
Рассмотрите: вместо того, чтобы добавлять простые числа между 2 и 100 в набор, допустим, мы хотим добавить первые 25 простых чисел в набор.
Нам нужно изменить внешний цикл на что-то «безопасное» (не совсем правильно, но только для этого примера), скажем, n = 1000. Таким образом, мы знаем, что мы не закончим простые числа, чтобы быть добавил; существует однозначно 25 простых чисел от 2 до 1000.
for (int n = 3; n < 1000; n++) {
addNumber = true;
....
СЕЙЧАС нам действительно нужно использовать перерыв! Перед завершением внешнего цикла в правильном образце кода ниже (от @ Nani2015), нам нужно добавить:
if(A.size() == 25)
break; //break out of outer loop -- we have the desired number of elements
Проверяется ли не набор, мы работаем с, A имеет количество элементов которого мы желаем, , Если FALSE: ничего не делать. Если TRUE: break (мы закончили)
Надеюсь, это прояснит ситуацию. В моем первоначальном вопросе использование перерыва было совершенно ненужным. Все, что мне нужно было сделать, это удалить и перерывов, и мой код работал бы по назначению. Однако ввод прерываний в неправильных областях вызвал проблемы. "ломать;" следует использовать, когда вы хотите или должны завершить цикл до, при котором выполняется его условие завершения.
Независимо от того, какое условие будет выполнено, вы вырваться из внутреннего цикла - таким образом, вы фактически не перебирать от я до п ... – MordechayS
Спасибо за указание на это. Я попытался поставить второй «перерыв»; в нескольких разных местах, но безрезультатно. Ваш комментарий на 100% правильный, но, оказывается, у моей фактической проблемы было два перерыва в целом. Не говоря уже о том, что разрыв здесь, по-видимому, был только вопросом эффективности. В принятом ответе также были рассмотрены некоторые улучшения в эффективности, которые можно было бы сделать. Кроме того, спасибо @BrainFRZ за помощь в форматировании вопроса. Могу ли я сам инициировать этот процесс? И мой реп объясняет, почему я не могу редактировать свои комментарии (см. Мои комментарии к принятому ответу)? – coder
Другой вопрос о задании? Как я уже говорил, вы ничего не узнаете, и вы неправильно используете этот ресурс. Вы сказали, что боитесь спросить учителя, вы не должны быть - они там, чтобы помочь вам. – wordsmith