Методика решения зада по теме «Обработка целочисленной информации».

Пример 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