-
-
Save Lodo4ka/ae39e4483b57b844b18768aa907fd4af to your computer and use it in GitHub Desktop.
// BEGIN (write your solution here) | |
const smallestDivisor = num => { | |
let divisor = 2; | |
if(num < 1) { | |
return NaN; | |
} | |
if(num === 1) { | |
return num; | |
} | |
while (num % divisor) { | |
divisor++; | |
} | |
return divisor; | |
}; | |
// END | |
export default smallestDivisor; | |
solution.js | |
Напишите функцию smallestDivisor. Она должна находить наименьший целый делитель числа. Поведение у функции должно быть таким же, как в предыдущем уроке, но реализация — код функции — должно быть другим. На этот раз реализуйте императивный итеративный процесс, что означает: | |
не используйте рекурсию | |
используйте переменные | |
используйте цикл while | |
Например, наименьший делитель числа 15 это 3. | |
smallestDivisor(15); // 3 | |
smallestDivisor(17); // 17 | |
smallestDivisor(0); // NaN | |
smallestDivisor(-3); // NaN | |
Замечание: Если переданное в smallestDivisor число меньше единицы, возвращайте NaN. | |
Идея алгоритма: | |
Попробуйте разделить число на 2. | |
Если число делится без остатка, то это наименьший делитель. | |
Если нет, то попробуйте следующий делитель. | |
Если ничего не делит число без остатка, то переданное число является простым, так что его наименьший делитель — оно само (не считая 1) | |
Подсказка | |
Вспомните про оператор % (modulus or остаток от деления) из урока 4. Он вычисляет остаток от деления одного операнда на другой. Например, 11%5 это 1, а 10%2 это 0. | |
Так что если x%y это 0, то y делит x без остатка. |
const smallestDivisor = (num) => {
if (num % 2 === 0 && num > 0) {
return 2;
} else if (num <= 0) {
return NaN;
} else if (num === 1) {
return num;
}
// Проверки на корректный ввод данных для значения "num"
const devider = (count = 2) => {
if (num % count !== 0) { /* Если "Num" делится на значение "devider" с остатком (остаток от деления не равен 0, к значению делителя прибовляем (+1) */
return devider(count + 1);
} else {
return count; /* Дефолтное значение (если остаток от деления равен 0, count остается прежним) */
}
}
return devider();
}
я правильно понимаю что запись
while (num % divisor) {
divisor++;
}
имеет условие без сравнения (===) и получается что любой остаток отличный от нуля это true, а нуль это false?
я правильно понимаю что запись while (num % divisor) { divisor++; }
имеет условие без сравнения (===) и получается что любой остаток отличный от нуля это true, а нуль это false?
если число перевести в булевое значение (все кроме 0 будет true) пока в условии while (true) - цикл будет выполняться. Как только число будет делиться без остатка итерации закончатся.
я правильно понимаю что запись while (num % divisor) { divisor++; }
имеет условие без сравнения (===) и получается что любой остаток отличный от нуля это true, а нуль это false?если число перевести в булевое значение (все кроме 0 будет true) пока в условии while (true) - цикл будет выполняться. Как только число будет делиться без остатка итерации закончатся.
thanks)
Вот так намного лучше, и то линтер ругается на "div = div + 1;", пишет - "error Assignment can be replaced with operator assignment operator-assignment"
`const smallestDivisor = (num) => {
let div = 2;
if (num < 1) {
return NaN;
}
if (num === 1) {
return num;
}
while (num % div) {
div = div + 1;
}
return div;
};`