@Roma789

Туплю в решении вроде бы простой задачи?

function g(n) {
  let b = 0;
  for(let i = 2; i <= n; i++){
    for (let j = 2; j < i; j++) {
      if (i % j !== 0){
        b+=1
      }
    }
  }
  console.log(b);
};
g(10)

Привет,вот функция подсчёта количества простых чисел,вроде всё правильно,но почему то счётчик набирает гораздо большее простые числа в промежутке от 2 до n чем на самом деле,например от 2 до 10 28 простых чисел,где я ошибся?
  • Вопрос задан
  • 217 просмотров
Пригласить эксперта
Ответы на вопрос 3
@402d
начинал с бейсика на УКНЦ в 1988
i % j !== 0

Как я понимаю Вы решаете задачу нахождения количества простых чисел меньше или равных заданному.
Сделал вывод по внешнему циклу i
Дальше вы пытаетесь проверить что i простое.
ну во первых j идти до i-1 не нужно - верхняя граница квадратный корень из i
во вторых цикл надо прерывать при остатке от деления равному нолю
и только если после прохода цикла не было сработки - число простое.

в общем как я писал сразу ошибка в логике проверки что число простое.
Простое число - нет ни одного делителя кроме 1 и N
т.е. цикл должен пробежать целиком и флаг остался истиной
Ответ написан
ThunderCat
@ThunderCat Куратор тега JavaScript
{PHP, MySql, HTML, JS, CSS} developer
где я ошибся?
...
 if (i % j !== 0){ //тут
    b+=1
 }
...

Кроме того, неплохо бы проверять что i <= j, чтобы не гонять лишние циклы
Ответ написан
lastuniverse
@lastuniverse
Всегда вокруг да около IT тем
Как вам уже объяснили, ошибка тут
if (i % j !== 0){ //тут
    b+=1
 }


Но так как для вас она не очевидна объясню. Возмем ситуацию когда i=6
и посмотрим как будет работать в данной ситуации внутренний цикл

for (let j = 2; j < i; j++) {
      if (i % j !== 0){
        b+=1
      }
    }

при j = 2 условие не сработает (и это правильно)
при j = 3 условие не сработает (и это правильно)
при j = 4 условие сработает (и это НЕ правильно)
при j = 5 условие сработает (и это НЕ правильно)

итого ваш алгоритм аж 2 раза посчитает что число 6 простое

думаю теперь вам станет понятней в чем ошибка и вы отметите ответы от ThunderCat и Олег как верные))))

ну и от себя добавлю - замените внутренний цикл на такой
for (let j = 2; j <= i/2; j++){
это в 2 раза уменьшит количество циклов. Почему это правильно предлагаю подумать самому))))
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы