@vtaeke

Как реализовать фукнцию, которая считает количество делителей положительного числа?

Как реализовать фукнцию, которая считает количество делителей положительного числа?
Второй тест проходит, остальные нет.

const dividerCounter = (n) => {
  let res = n / 2;
  let count = 1;
  
  for (let i = 0; i <= n; i++) {
    if (!(n % i)) {
      ++count;
    } 
     return count;
  }
}


4 --> 3 (1, 2, 4)
5 --> 2 (1, 5)
12 --> 6 (1, 2, 3, 4, 6, 12)
30 --> 8 (1, 2, 3, 5, 6, 10, 15, 30)
  • Вопрос задан
  • 799 просмотров
Решения вопроса 3
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
const dividerCounter = (n) => {
  let count = 0;
  for (let i = 1; i <= n; i += 1) {
    if (n % i === 0) {
      count += 1;
    } 
  }
  return count;
}
Ответ написан
Комментировать
ProgrammerForever
@ProgrammerForever
Учитель, автоэлектрик, программист, музыкант
Не знаю, с чего начать...
let i = 0
Будет делиться на 0 в первой итерации
count = 1
Почему 1? Какой делитель уже посчитан? Должно быть 0.
let res = n / 2;
Это тут - для мебели?
return count;
не на том месте, вызовется на первой итерации, а не в конце цикла
Ответ написан
Комментировать
Alexandroppolus
@Alexandroppolus
кодир
перебирать по одному - долго. Можно находить простые делители, выяснять их максимальную степень в составе числа, и делить число на найденное простое в этой степени. Делители числа могут состоять только из тех же простых, но в степенях не более, чем эти простые в составе числа.

например, число 60 = 2^2 * 3 * 5.
Здесь в составе числа есть простые числа 2, 3 и 5. В делителях числа 60 двойка может быть в степенях 0,1,2, то есть всего 3 варианта. Тройка и пятерка - только в степенях 0 и 1, то есть по 2 варианта. И мы просто перемножаем количества вариантов. 3 * 2 * 2 = 12, то есть всего 12 различных делителей у числа 60

const dividerCounter = (n) => {
    let num = n;
    let count = 1;

    for (let i = 2; i <= num; i++) {
        if (num % i === 0) {
            // num делится на i. Значит, i - простое.
            // Если бы оно не было простым, то состояло бы из других простых,
            // более мелких. Но ведь их выкинули из num на предыдущих итерациях.
            let pow = 1;
            let ipow = i;

            // определяем степень для простого числа i
            for (let ipowNext = i * i; num % ipowNext === 0; ipowNext = ipowNext * i) {
                pow++;
                ipow = ipowNext;
            }

            count = count * (pow + 1);
            num = num / ipow; // теперь в составе num нет простого числа i
        }
    }

    return count;
}


эта оптимизация, конечно, не будет работать, если в dividerCounter передать простое число - там придется честно по одному дойти до этого числа. Но таких чисел относительно мало.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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