Как работает код выводящий простые числа?

Я не пойму как выполняются итерации в этом коде:

let n = 10;

nextPrime:
  for (let i = 2; i <= n; i++) { 
    for (let j = 2; j < i; j++) { 
      if (i % j == 0) continue nextPrime; 
    }
    console.log( i ); 
  }

Вот i = 2 и j = 2 при i % j должен выполниться continue и пропустить число 2, но оно выводится, почему?

Объясните пожалуйста как работают в этом коде итерации, например, почему не возвращаются числа 4, 6, 8, 9, 10?


Ответы (2 шт):

Автор решения: mrvol

Насколько я понял, nextPrime это метка для continue.

let n = 10;

nextPrime:
for (let i = 2; i <= n; i++) { 
  for (let j = 2; j < i; j++) { 
    if (i % j == 0) continue nextPrime; // идем на nextPrime, т. е. внутренний цикл прерывается.
   }
   console.log( i ); 
}

Вывод:

2
3
5
7

Резюмирую - код написан недружелюбно, но рабочий.

→ Ссылка
Автор решения: OPTIMUS PRIME

nextPrimeназвание первого цикла (в современном коде такое практически не встречается), оно позволяет из вложенных циклов управлять внешним циклом.

А у вложенного:

for (let j = 2; j < i; j++) {
  if (i % j == 0) continue nextPrime;
}

Написано «если хотя бы одно число j ДО числа i делится на него без остатка, значит i - не простое число, не надо его выводить» — вложенный цикл прерывается, а внешний (nextPrime) идет на следующую итерацию (continue).

Это можно переписать так:

let n = 20;

for (let i = 2; i <= n; i++) {
  if ( !isPrime(i) ) continue;
  console.log(i);
}

function isPrime(n) {
  for (let j = 2; j < Math.sqrt(n + 1); j++) {
    if (n % j == 0) return false;
  }
  
  return true;
}

j < Math.sqrt(n+1) вместо j < n: нет смысла проверять прямо все числа, достаточно до √n

→ Ссылка