Skip to content

Instantly share code, notes, and snippets.

@Lodo4ka
Created April 10, 2018 18:07
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Lodo4ka/ae39e4483b57b844b18768aa907fd4af to your computer and use it in GitHub Desktop.
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 без остатка.
@AngelD13
Copy link

Вот так намного лучше, и то линтер ругается на "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;
};`

@evgeniy-kolmak
Copy link

evgeniy-kolmak commented Jan 25, 2022

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();
}

@VForVogue
Copy link

я правильно понимаю что запись
while (num % divisor) {
divisor++;
}

имеет условие без сравнения (===) и получается что любой остаток отличный от нуля это true, а нуль это false?

@evgeniy-kolmak
Copy link

я правильно понимаю что запись while (num % divisor) { divisor++; }

имеет условие без сравнения (===) и получается что любой остаток отличный от нуля это true, а нуль это false?

если число перевести в булевое значение (все кроме 0 будет true) пока в условии while (true) - цикл будет выполняться. Как только число будет делиться без остатка итерации закончатся.

@VForVogue
Copy link

я правильно понимаю что запись while (num % divisor) { divisor++; }
имеет условие без сравнения (===) и получается что любой остаток отличный от нуля это true, а нуль это false?

если число перевести в булевое значение (все кроме 0 будет true) пока в условии while (true) - цикл будет выполняться. Как только число будет делиться без остатка итерации закончатся.

thanks)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment