2016-10-16 6 views
0

Реферат: Попытка изучить альтернативные способы ведения дел. Часть 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, вместо того, чтобы использовать условие, которое я указал?

Моя логика:

  1. подготовить все (создать материал, добавить 2 установить)
  2. условие addNumber - если это правда, добавить, что к набору, если нет, то перейти к следующему номеру
  3. внешняя петля - n - число проверяется. начинаются с 3, Приращение на 2 секунды (без четных чисел будет простым), до 100
  4. внутренний цикл - диапазон i - "i -> n" используется для проверки, является ли простой. если п делится на I, число которых не является простым
  5. , если число не было установлено нарушение п% I == 0, добавить его к вектору
  6. , если оно было установлено, что нарушает условия, выход внутренней петля и переместиться на следующее число

Не понимаю, зачем ломаться; не работает, как я предполагаю. Я не понимаю, почему, даже если перерыв каким-то образом не сработает, я указываю, что условие завершения не работает. Я не понимаю, почему мне кажется, что мой чек никогда не достигнут, и он просто добавляет каждые 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?

Prime Number Generator Logic

идеальным ответом будет б 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 (мы закончили)

Надеюсь, это прояснит ситуацию. В моем первоначальном вопросе использование перерыва было совершенно ненужным. Все, что мне нужно было сделать, это удалить и перерывов, и мой код работал бы по назначению. Однако ввод прерываний в неправильных областях вызвал проблемы. "ломать;" следует использовать, когда вы хотите или должны завершить цикл до, при котором выполняется его условие завершения.

+0

Независимо от того, какое условие будет выполнено, вы вырваться из внутреннего цикла - таким образом, вы фактически не перебирать от я до п ... – MordechayS

+0

Спасибо за указание на это. Я попытался поставить второй «перерыв»; в нескольких разных местах, но безрезультатно. Ваш комментарий на 100% правильный, но, оказывается, у моей фактической проблемы было два перерыва в целом. Не говоря уже о том, что разрыв здесь, по-видимому, был только вопросом эффективности. В принятом ответе также были рассмотрены некоторые улучшения в эффективности, которые можно было бы сделать. Кроме того, спасибо @BrainFRZ за помощь в форматировании вопроса. Могу ли я сам инициировать этот процесс? И мой реп объясняет, почему я не могу редактировать свои комментарии (см. Мои комментарии к принятому ответу)? – coder

+0

Другой вопрос о задании? Как я уже говорил, вы ничего не узнаете, и вы неправильно используете этот ресурс. Вы сказали, что боитесь спросить учителя, вы не должны быть - они там, чтобы помочь вам. – wordsmith

ответ

1

Я рекомендую использовать IDE, например Eclipse, он показывает, есть ли мертвый код. В вашем случае i ++ - это мертвый код, так как вы делаете i = n + 1. i после первой итерации i всегда больше n. Используйте следующий код в качестве ссылки

public static void main(String[] args) { 
    HashSet<Integer> A = new HashSet<>(); 
    A.add(2); 
    boolean addNumber; 
    for (int n = 3; n < 100; n++) { 
     addNumber = true; 
     for (int i = 2; i <= n/2; i++) { 
      if (n % i == 0) { 
       addNumber = false; 
       break; 
      } 
     } 
     if (addNumber) 
      A.add(n); 
    } 
    System.out.println(A); 
} 
+0

Спасибо! Это именно то, что я искал, и имеет смысл. Видеть код и думать об этом всегда кажется более эффективным для меня, в отличие от чтения абзацев о логике; например, «команда break делает ___». – coder

+0

(По какой-то причине я не смог изменить свой предыдущий комментарий в течение 5-минутного окна. Я не видел кнопку редактирования или значок карандаша или что-нибудь (?) Извините за двойной пост здесь.) – coder

+0

^сделал это снова. ..может модератор, пожалуйста, исправьте это? В любом случае, я пытался сказать: я отметил ваш ответ как принятый и поддержал его. Спасибо за ваш быстрый, понятный ответ! – coder