Методика решения зада по теме «Обработка целочисленной информации».
Пример 1: Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [84052; 84130], число, имеющее максимальное количество различных натуральных делителей, если таких чисел несколько — найдите минимальное из них. Выведите на экран количество делителей такого числа и само число.
Например, в диапазоне [2; 48] максимальное количество различных натуральных делителей имеет число 48, поэтому для этого диапазона вывод на экране должна содержать следующие значения:
10 48
Решение: это задание на поиск максимума. Но нужно найти еще и число, которое этот максимум дает (имеет столько делителей).
Последовательность целых чисел [84052; 84130], ищем максимум среди числа делителей.
Мы должны искать максимум среди количеств делителей, перебирая числа отрезка [84052; 84130]. Количество делителей очередного числа не зависит от количества делителей предыдущих чисел, потому нет необходимости хранить какую-то информацию о предыдущих числах.
Перебор чисел в заданном диапазоне делается при помощи цикла со счетчиком. Так как нужно определить не только максимум, но само число, имеющее столько делителей, необходимо хранить пару (текущий_максимум, число_соответсвующее_этому_максимуму) - обозначим (Max, Xmax).
Для поиска делителей числа Х можно перебрать все целые числа от 1 до Х и подсчитать, сколько раз Х делится на такое число.
Максимум корректируется, только если очередной максимум строго больше текущего. Числа Х перебираются в порядке возрастания, поэтому «если таких чисел несколько — найдено будет минимальное из них».
Напишем программу на языке Паскаль:
CONST
X1=84052; {левая граница отрезка}
X2=84130; {правая граница отрезка}
VAR Max, {максимальное кол-во делителей}
Xmax, {число, имеющее такое количество делителей}
X, {очередное число}
K : integer; {количество делителей этого числа}
d: integer; {для перебора делителей}
BEGIN
Max:=0; {начальное значение максимума}
{Xmax не присваиваем,т.к. вначале оно не определено}
{цикл по всем числам отрезка}
for X:=X1 to X2 do begin
{подсчет числа делителей числа Х}
K:=0; {пока делителей нет}
for d:=1 to X do
{"остаток равен 0" = "X делится на d"}
if X mod d =0 then K:=K+1; {увеличим счетчик делителей}
{теперь K=количество делителей числа Х }
if K>Max then begin {если текущее число делителей больше}
{коррекция максимума}
Max:=K; {новый максимум}
Xmax:=X; {и новое число, соответствующее максимуму}
end;
end;
{вывод результата}
Writeln (Max,' ',Xmax);
END.
Эта программы выдает результат: 72 84084
Пример 2: Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [125 256; 125 330], числа, имеющие ровно шесть различных чётных натуральных делителей. Для каждого найденного числа запишите эти шесть делителей в шесть соседних столбцов на экране с новой строки. Делители в строке должны следовать в порядке возрастания.
Например, в диапазоне [2; 48] ровно шесть чётных различных натуральных делителей имеют числа 24, 36 и 40, поэтому для этого диапазона вывод на экране должна содержать следующие значения:
2 4 6 8 12 24
2 4 6 12 18 36
2 4 8 10 20 40
Решение: для каждого целого числа из отрезка [125 256; 125 330] будем перебирать все четные делители d от 2 до самого этого числа.
Для каждого возможного делителя d нужно проверить, действительно ли он является делителем. Если является, то увеличиваем счетчик делителей К. Цикл прекращаем, если d становится больше числа Х или найдено 7 делителей (K 6). Т.е. условие продолжения цикла “d
X И К
6”. Здесь нельзя взять в качестве условия продолжения К
6, потому что так мы найдем 6 первых делителей, но не будем знать, что их ровно 6 (возможно их больше). После проверки всех делителей данного числа, проверяем равно ли К шести. Если К
6, то нужно напечатать все эти делители. А для этого, нужно запомнить делители в массиве. Достаточно массива из 6 элементов. Поскольку мы может получить 7 делителей (это придется делать, чтобы обнаружить случай, когда делителей более 6), необходимо перед присваиванием элементу массива проверять, что К
6.
Напишем программу на языке Паскаль:
CONST {границы отрезка желательно задать как константы, т.к. это позволяет легко их изменить при необходимости}
X1=125256; {левая граница отрезка}
X2=125330; {правая граница отрезка}
VAR V : array[1..6] of integer; {массив для 6 делителей числа}
X : integer ; {очередное число}
K : integer; {кол-во делителей этого числа}
d : integer; {для перебора делителей}
BEGIN
{цикл по всем числам отрезка}
for X:=X1 to X2 do begin
{подсчет числа делителей числа Х}
K:=0; {пока делителей нет}
d:=2; {первый возможный четный делитель}
while (d<=X) and (K<=6) do begin
{"остаток равен 0" = "X делится на d"}
if X mod d = 0 then begin
K:=K+1; {увеличим счетчик делителей}
if K<=6 then {больше 6 делителей не нужно}
V[K]:=d;{запоминаем этот делитель}
end;
d:=d+2; {следующий возможный четный делитель}
end;
{Теперь K=количество делителей числа Х (при К<=6).
Если К=7, то делителей 7 или больше.}
if K=6 then begin {если делителей ровно 6}
{все их выводим}
for K:=1 to 6 do begin
write(V[K],' ');
end;
writeln;{переход на новую строку}
end;
end;
END.
Результат запуска программы:
2 6 18 13918 41754 125262
2 4 8 31322 62644 125288
2 6 18 13922 41766 125298