Модуль: ЕГЭ-2022. Вопрос 25. Поиск делителей


Задача

5 /11


Делители числа - оптимальный алгоритм

Теория Нажмите, чтобы прочитать/скрыть


Оптимальный алгоритм

Количество проверок возможных делителей можно существенно сократить, если учесть, что у каждого делителя d числа n, не превышающего \(\sqrt n\), есть "симметричный" (парный) ему делитель, получающийся в результате деления n на d.
 
Пример
Для n = 30 достаточно найти делители 1, 2, 3, 5 (целая часть \(\lfloor \sqrt {30} \rfloor = 5 \)). Все остальные делители можно получить следующим образом:
30 / 1  = 30
30 / 2 = 15
30 / 3 = 10
30 / 5 = 6

Исключением является число, которое является точным квадратом. В этом случае у делителя \(d= \sqrt{n}\) "симметричного" ему делителя нет.
Напишем полностью программy, использующую оператор цикла с предусловием (while), которая подсчитывает количество делитей числа n.

C++

#include <iostream>

using namespace std;

main()
{
  int n;
  cin >> n;
  
  int k = 0, i = 1;
  while (i * i < n)
  {
      if (n % i == 0)
      {
          k += 2; // учитывая симметричный делитель
    }
    i += 1;  // переходим к следующему числу
  }
  // проверяем, является ли число n точным квадратом;
  // если n является точным квадратом, то количество делителей
  // увеличиваем на 1.
  if (i * i == n)
  {
      k += 1;
  }
  
  cout << k;
}

Python
n = int(input())
k = 0
i = 1
while i * i < n:
    if n % i == 0:
        k += 2 # учитываем симметричный делитель
    i += 1 # переходим к следующему числа

# проверяем, является ли число n точным квадратом;
# если n является точным квадратом, то количество делителей
# увеличиваем на 1.
if i * i == n:
    k += 1

print(k)

Pascal
var
  n, i, k: integer;
begin
  readln(n);
  k := 0;
  i := 1;
  while i * i < n do
  begin
    if n mod i = 0 then
      k := k + 2; // учитываем симметричный делитель
    i := i + 1; // переходим к следующему числа
  end;
// проверяем, является ли число n точным квадратом;
// если n является точным квадратом, то количество делителей
// увеличиваем на 1.
  if i * i = n then
    k := k + 1;

write(k)
end.


Примечание
В операторе цикла проверяются числа i, меньшие квадратного корня из n. После окончания работы цикла переменная i может быть равна \(\sqrt n\) (число n является точным квадратом). В этом случае необходимо учесть этот делитель. 

Также можно отдельно рассматривать варианты, когда n - нечетное число и перебирать только нечетные значения i

Задача

Дано натуральное число N - количество чисел (1<=N<=103), и натуральные не простые числа ai (1<=ai<=105). Для каждого числа ai выведите его наименьший и наибольший делители, не равные 1, 2, 3 и ai/2, ai/3, ai.  

Входные данные
В первой строке программа получает на вход подается натуральное число N (1<=N<=103). В следующих N строках задаются числа a(100<=ai<=105), каждое число в отдельной строке.

Выходные данные
Для каждого числа ai выведите в отдельной строке два числа через пробел - его  наименьший и наибольший делители, не равные 1, 2, 3 и ai/2, ai/3, ai
 
Примеры
Входные данные Выходные данные
1 5
731
1034
460
618
667
17 43
11 94
4 115
6 103
23 29

time 1000 ms
memory 256 Mb
Правила оформления программ и список ошибок при автоматической проверке задач

Статистика успешных решений по компиляторам
 Кол-во
С++ Mingw-w646
Python128
Комментарий учителя