Вопрос пользователя Nikita Ivakh в уроке «Цикл for и изменение переменных», курс «Введение в программирование»

Nikita Ivakh

Здравствуйте, помедитировал пару часиков и пришел к тому, чтобы в цикле за каждое успешное деление без остатка возвращало 1 и прибавлялось к начальному значению (0). А далее сравнить результат с 2 (количеством делителей). То есть, если допустим деления от 4 делители будут 1, 2, 4, значит в сумме от полученных результатов будет 3, а 3 больше чем 2, значит конечный результат false. Подскажите, в правильном ли я направлении я иду, является ли такой способ правильным. Если да, то прошу показать где в моем коде ошибка, что в результат возвращается число, а не true или false. Если нет, то подскажите другой алгоритм решения, ибо не могу придумать других вариантов

https://ru.hexlet.io/code_reviews/196412

6 0

Alexander Ismailov

У тебя по сути уже есть готовое решение, просто в какой-то момент ты все усложнил. Подумай, если у тебя хотя бы один раз выполнится условие if (num % i === 0) , то разве это простое число?

0

Nikita Ivakh

Alexander Ismailov, Ну, по моей задумке, сначала 1 , далее само число. Если количество делителей больше чем 2(значит помимо единицы и самого num присутствуют другие делители) значит число не простое. Например число 4, по моей задумке сначала идет 1, это число подходит, значит к 0 + 1, далее 2 , тоже делитель , значит 0 + 1 + 1, далее 3 не подходит и далее 4, который также подходит , значит 0 + 1 + 1 + 1. Так я определю что количество делителей больше чем 2, значит число не является простым и результат false Надеюсь вы поняли мою задумку Или это я где то ошибаюсь ?

0

Alexander Ismailov

Nikita Ivakh, согласен так тоже можно посчитать. Но представь ситуацию если например нам надо рассмотреть хотя бы число 16, ход вычислений, по твоему алгоритму, будет такой:

16 % 1 === 0 <- true // count += 1 -> count === 1 данная итерация даст 0 в остатке для любого числа, ее бессмысленно вычислять.

16 % 2 === 0 <- true // count += 1 -> count === 2, т.е. уже понятно, что это не простое число

16 % 3 === 1 <- false // count === 2, зачем это вычислять? Если и так уже понятно после 2й итерации, что число не простое.

16 % 4 === 0 <- true // count += 1 -> count === 3

....

16 % 16 === 0 <- true // count += 1 -> count === 15

Ты видишь сколько лишних итераций пораждает твой алгоритм? А если тебе надо вычислить является ли число 4 500 000 022 простым? Понять это можно совершив всего одну итерацию поделив на 2, но твой алгоритм совершит 4 500 000 021 итераций (шагов), прежде чем даст ответ, является ли число простым или нет.

" Если да, то прошу показать где в моем коде ошибка, что в результат возвращается число, а не true или false " - return в цикле не дает довыполнится остальной части твоей функции, обрати на это место внимание.

0

Nikita Ivakh

Alexander Ismailov, Благодарю, понял что делая такое количество бесполезных операций я бы нагружал компьютер при больших числах. Также понял ошибку свою в условии for, а также почему при выполнении хотя бы одного раза if (num % i === 0) должно выводить false (все было дело в самом for, где я указал число 1, вместо двух, а также заканчивал цикл если делитель равен числу , а должен был просто i < num) Но все же пишу еще раз, ибо последний момент, который я не понял испортил мне всю статистику (пришлось подсмотреть в решение учителя) А именно застрял на числе 21, а также не совсем понял почему return true выводится за пределы for. Сначала i = 2, 21 делим на 2 , получаем остаток. Я правильно понимаю, что проверка будет проходить пока цикл не вернет мне false? ( в данном случае когда i будет равен 3) i = 2 , 21 / 2 есть остаток и функция ничего не возвращает и начинает повторное выполнение только i + 1. i = 3, 21 / 3 нет остатка , значит возвращает false. Если бы число было 7 Проводилось бы вычисления от 2 до 6, где функции не было бы чего возвращать, а в конце когда for прекращается, то переходит уже к return true который вне цикла for. Я правильно понимаю данный цикл ? Просто до решения учителя я делал так: if ( num % i === 0 ) { return false} else { return true } И у меня не проходило при числе 21

https://ru.hexlet.io/code_reviews/196412

0

Alexander Ismailov

Nikita Ivakh, привет.

Я правильно понимаю, что проверка будет проходить пока цикл не вернет мне false?

Да.

Но если за все конечное число итераций (шагов) данное условие так и не выполнится, то в этом случае мы выйдем из функции через оператор return который возвращает true.

В случае же, когда условие выполняется, то мы так никогда и не дойдем до оператор return который возвращает true, а покинем функцию через оператор return false из блока if, на той итерации в которой было удовдетворено условие, т.е. даже не довыполнив цикл до конца.

То есть, грубо говоря, это некий break, не только для цикла, а для всей функции в целом.

Например, при определенных условиях, ты можешь заменить опреатор break в составе switch на return value; таким образом завершив проходку по его кейсам и по всей функции в целом.

Оператор return - это то место в котором мы заканчиваем выполнять функцию и выходим из её лексической области выдимости (Л.О.В.), в ту Л.О.В. из которой эта функция была вызвана.

https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Statements/return

0

Nikita Ivakh

Alexander Ismailov, Понял, спасибо =)))

0

Есть вопрос или хотите участвовать в обсуждении?

Зарегистрируйтесь или войдите в свой аккаунт

Нажимая кнопку «Зарегистрироваться», вы даёте своё согласие на обработку персональных данных в соответствии с «Политикой конфиденциальности» и соглашаетесь с «Условиями оказания услуг». Защита от спама reCAPTCHA «Конфиденциальность» и «Условия использования».

Похожие вопросы

Татьяна около 7 часов назад →

https://ru.hexlet.io/code_reviews/318108 Подскажите, что здесь не то?

Вера 6 дней назад →

Добрый день. Аутпут указывает на ; , но мои манипуляции с ; не помогли исправить положение. Что я делаю не ...

Aliona 14 сентября 2020 →

https://ru.hexlet.io/code_reviews/314529 не понимаю, почему не работает?

Мария 07 сентября 2020 →

Добрый день, стилистических ошибок не найдено, но задание не выполняется, не понимаю в чем проблема... user...

Максим Белоусов 06 сентября 2020 →

В задании написано: "Простое число — целое положительное число..". В тесте проверяются только целые положит...