@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)
  • Вопрос задан
  • 606 просмотров
Решения вопроса 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 передать простое число - там придется честно по одному дойти до этого числа. Но таких чисел относительно мало.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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