За последние 24 часа нас посетили 20483 программиста и 1088 роботов. Сейчас ищут 1016 программистов ...

ДВойной цикл For

Тема в разделе "JavaScript и AJAX", создана пользователем denis_alekss, 17 дек 2020.

  1. denis_alekss

    denis_alekss Новичок

    С нами с:
    1 дек 2020
    Сообщения:
    8
    Симпатии:
    0
    Есть задача:

    Код (Text):
    1.  
    2. Вывести простые числа
    3.  
    4. Натуральное число, большее 1, называется простым, если оно ни на что не делится, кроме себя и 1.
    5.  
    6. Другими словами, n > 1 – простое, если при его делении на любое число кроме 1 и n есть остаток.
    7.  
    8. Например, 5 это простое число, оно не может быть разделено без остатка на 2, 3 и 4.
    9.  
    10. Напишите код, который выводит все простые числа из интервала от 2 до n.
    11.  
    12. Для n = 10 результат должен быть 2,3,5,7.
    13.  
    14. P.S. Код также должен легко модифицироваться для любых других интервалов.

    Вот решение задачи вложенным циклом FOR


    Код (Text):
    1.  
    2. let n = 10;
    3. nextPrime:
    4. for (let i = 2; i <= n; i++) { // Для всех i...
    5.   for (let j = 2; j < i; j++) { // проверить, делится ли число..
    6.   if (i % j == 0) continue nextPrime; // не подходит, берём следующее
    7.   }
    8.   alert( i ); // простое число
    9. }
    Натуральное число, большее 1, называется простым,
    если оно ни на что не делится, кроме себя и 1.
    Как я понял, например если взять число 4,
    оно не простое, оно делится и на себя и на 1 и на четное 2.

    Теперь если глянуть на код как он работает.

    1-ая итерация цикла:
    Идет проверка на остаток числа 3/2= есть остаток от деления.
    Алерт должен вывести 3 а не 2, но почему вывод вначале двйоки произошел?
    Ведь i = 3 за первым прогоном после i++ он стал 3
    2-ая итерация цикла:
    Метка перешла на начало цикла и пошла проверка 4/3?

    Объясните, как происходит первая и вторая итерация в этом коде цифрами, что на что делится и как выводится очередность?
    Я модернизировал код с кнопкой, для удобности, но как происходит проверка при итерациях не понял.

    Код (Javascript):
    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4.   <meta charset="utf-8">
    5.   <title>Тест</title>
    6.   <script>
    7.   function fanta(){
    8.   let rez =  one.elements.number.value;
    9.   nextPrime:
    10.   for(let i = 2; i<=rez; i++){
    11.   for( let j = 2; j < i; j++){
    12.   if(i%j ==0) continue nextPrime;
    13.   }
    14.   document.write(i+"<br>");  
    15.   }
    16. }
    17.  
    18.   </script>
    19. </head>
    20. <body>  
    21. <form id="one">
    22.   <input type="text" name="number" >
    23.   <input type="submit" onClick="fanta()" value="Жми">
    24. </form>
    25.  
    26. <p id='result'></p>
    27.  
    28. </body>
    29. </html>
     
  2. denis_alekss

    denis_alekss Новичок

    С нами с:
    1 дек 2020
    Сообщения:
    8
    Симпатии:
    0
    Вроде разобрался, но прочитайте в самом конце вопрос и дайте пожалуйста ответ там на вопрос.

    К примеру пользователь первоначально в вводит цифру 10 И мы нажимаем кнопку жми.

    Сейчас напишу как я понял, как работает двойной цикл for.


    [js]nextPrime:

    for(let i = 2; i<=rez; i++){

    for( let j = 2; j < i; j++){

    if(i%j ==0) continue nextPrime;

    }

    document.write(i+"<br>");

    }
    [/js]

    Код (Text):
    1. 1. В самом начале во Внутренним цикле for идет сравнение 2<2?
    2.   (i=2, j=2) нет 2 не меньше двух, Внутренний цикл for не выполняется, так
    3. как условие ложь и идёт переход со внутреннего во внешний цикл for где
    4.  выполняется инструкция с выводом document.write(i+"<br>");  Выводим в конечный
    5. результат  Первую цифру 2 на экран.
    6.  
    7. <-------------------------------------------------------------------------------------------------->
    8.  
    9. 2. i увеличивается на один во внешнем цикле for, i =3, Далее во внутреннем
    10. цикле for идёт сравнение 2<3?  (j=2, i=3) Да, 2 меньше трех и выполняется
    11.  условие if Во внутреннем цикле. 3/2 дает остаток 0? Нет, не дает, Идёт возврат снова
    12.  во внутренний цикл где (j=3, i=3), 3<3? Нет, не меньше, Внутренний Цикл for
    13. не выполняется Идёт переход во внешний цикл For в котором выполняется инструкция
    14.  
    15. document.write(i+"<br>");  Выводим в конечный результат цифру 3 на экран.
    16.  
    17. <-------------------------------------------------------------------------------------------------->
    18.  
    19. 3.i увеличивается на один во внешнем цикле for, i =4, Далее во внутреннем
    20.  цикле for идёт сравнение 2<4?  (j=2, i=4) Да, 2 меньше 4 и выполняется условие
    21.  if Во внутреннем цикле. 4/2 дает остаток 0 -это истинна и идет переход
    22.  к метке nextPrimе.  Запускается внешний цикл снова,  увеличивается i на один
    23. во внешнем цикле for и i =5.  Далее во внутреннем цикле for идёт сравнение 2<5?  
    24. (j=2, i=5), Да, меньше, выполняем if во внутреннем цикле, if дает ложь. Идёт переход
    25.  снова во внутренний цикл for, j увеличивается на 1 (j=3, i=5).
    26.  
    27.   3<5? Да, снова выполняется условие if,
    28.  
    29. 5/3 дает ложь, идет снова возврат во внутренний цикл for, (j=4, i=5),
    30.  
    31. Выполняется снова if, 5/4 дает ложь, снова возврат во внутренний цикл
    32.  
    33. (j=5, i=5) 5<5, Нет не меньше идёт переход во внешний
    34.  цикл for где выводится через  document.write(i+"<br>");
    35.  
    36. результат на экран Имеем уже на данный момент 2,3, 5 на выводе.
    37.  
    38. <-------------------------------------------------------------------------------------------------->
    39.  
    40. 4. i увеличивается на один во внешнем цикле for, i =6, Далее во внутреннем цикле for
    41. идёт сравнение 2<6?  (j=2, i=6) Да, 2 меньше 6 и выполняется условие if Во внутреннем
    42. цикле. 6/2 дает остаток 0, идете переход к метке. Снова запускается внешний цикл for,
    43. уже  i=7. Во внутреннем цикле for Идёт сравнение 2<7, да. Условие иф дает ложь
    44.  при 7/2, происходит возврат во внутренний цикл for (j=3, i=7) Условие иф дает ложь
    45.  при 7/3, происходит возврат во внутренний цикл for (j=4, i=7) Условие иф дает ложь
    46.  при 7/4, происходит возврат во внутренний цикл for (j=5, i=7) , Условие иф дает ложь
    47.  при 7/5, происходит возврат во внутренний цикл for (j=6, i=7) Условие иф дает ложь
    48. при 7/6, происходит возврат во внутренний цикл for (j=7, i=7). 7<7? Нет, Идет переход
    49.  во внешний цикл for в котором document.write выводит на экран цифру семь.
    50. <-------------------------------------------------------------------------------------------------->
    51.  
    52. 5. i увеличивается на один во внешнем цикле for, i =8, Далее во внутреннем цикле for
    53. идёт сравнение 2<8?  (j=2, i=8) Да, 2 меньше 8 и выполняется условие if во внутреннем
    54. цикле. 8/2 дает остаток 0 -это истинна и идет переход к метке nextPrimе. Во внутреннем
    55. цикле for Идёт сравнение 2<9, да, выполняется if 9/2 дает ложь, далее j++, идет
    56.  возврат во внутренний цикл, j увеличивается на 1.(j=3, i = 9). 3<9? Да, выполняется
    57.  условие if. 9/3 условие истинно и идет переход к метке, а затем i увеличивается
    58. с 9 на 10 во внешнем цикле for.
    КАКИМ ОБРАЗОМ ВЫВОДИТСЯ 9?
     
    #2 denis_alekss, 18 дек 2020
    Последнее редактирование: 18 дек 2020