Лічильник
Сьогодні Разом
Відвідувань 51 5273725
Авторізацій 0 423086
Користувачів 0 2728
Статья

40. Количество делителей


Для закрепления темы "Простые числа" разберем задачу: Определить количество делителей заданного натурального числа.

Очевидно, что задачу можно решить перебрав все делители от единицы до самого числа и если исходное число делится без остатка на текущий делитель, то увеличиваем счетчик делителей на единицу.

Однако этот алгоритм по выше описанным причинам непригоден на практике. Решим эту задачу иначе: Найдем все делители, значения которых не превышают корня квадратного от заданного числа. Остальные делители - это результат деления исходного числа на уже найденный делитель из диапазона от двух до корня квадратного делимого. Исключением может составлять, случай когда делитель точно равен корню квадратному исходного числа.

И как и ранее, мы за приемлемое время вычислим все делители и их количество. Алгоритм очевиден:
 d := 2;
 flag := (n > 1);
 count := 0;
 while (flag) and (d * d <= n) do
  begin
   count := count + byte(n mod d = 0);
   inc(d);
  end;
Мы нашли количество делителей заданного числа в диапазоне от двух до корня квадратного включительно! К этому числу надо прибавить единицу, так как на единицу исходное число тоже делится. Теперь определим количество делителей в диапазоне от корня квадратного до самого числа - а их столько же, сколько и в первом диапазоне, до корня квадратного!
Следовательно всего количество делителей (count + 1) * 2, но делитель, значение которого равно корню квадратному исходного числа в этом счете присутствует дважды! Поэтому, если существует делитель, равный корню квадратному из исходного числа, то из общего числа делителей следует вычесть единицу.

Задача решена!