Задание 25 ЕГЭ по информатике — Обработка целочисленной информации (делители, маски)
Разбор номера «Обработка целочисленной информации (делители, маски)»: как устроено задание, настоящие формулировки из тренажёра с подсказками и официальным решением. Окно практики открывается сразу — без регистрации и онбординга.
Задание 25 (№25 — Обработка целочисленной информации (делители, маски)) — вопрос первой части экзамена по информатике: короткий ответ, который проверяется автоматически. Ниже — реальные формулировки из тренажёра с подсказками и разбором; проверка работает прямо на этой странице.
Окно примера ниже — то же, что на сайте: подсказки по одной, автопроверка ответа и разбор.
Примеры задания 25
№ 25Пример 1краткий ответ★★★★★1 первичный балл
Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы: — символ «?» означает ровно одну произвольную цифру; — символ «*» означает любую последовательность цифр произвольной длины; в том числе «*» может задавать и пустую последовательность. Например, маске 123*4?5 соответствуют числа 123405 и 12300405. Найдите все натуральные числа, не превосходящие 108, для которых выполнены все условия: — соответствуют маске 1?4*6?8; — делятся на 2622 без остатка. В ответе запишите в первом столбце таблицы все найденные числа в порядке возрастания, справа от каждого числа их частное от деления на 2622. Ответ:
Подсказка 1. Пойми, что требуется от числа: соответствие маске или свойство его натуральных делителей.
Подсказка 2. Маску проверяй через fnmatch по строке числа, а делители ищи перебором до корня из числа и добавляй сразу парный делитель.
Подсказка 3. Не включай само число, если сказано без него, и выводи ответ в нужном порядке. Ловушка — перебирать делители до самого числа и не уложиться во времени.
Разбор.
Решение. Будем последовательно рассматривать каждое целое число, кратное 2622, затем каждое число проверять на соответствие маске. Приведём решение на языке Python. from fnmatch import * for x in range(0, 10**8, 2622): # Перебираем все числа от 0 с шагом 2622, будут получены числа кратные 2622 if fnmatch(str(x), '1?4*6?8'): # Проверяем полученное число соответствию заданию print(x, x // 2622) В результате работы программа должна вывести следующее: 154698 59 11468628 4374 12425658 4739 15401628 5874 16476648 6284 17433678 6649 19452618 7419 Приведём решение Юрия Красильникова на языке Python. from itertools import product цифры = '0123456789' # Т. к. число Приведём решение Сергея Донец на PascalABC.NET: begin var d:=2622; foreach var x in Range(d, 10**8, d) do if x.ToString.IsMatch('^1.4.*6.8$')//1?4*6?8 then Println(x, x/d); end.
Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [210 235; 210 300], числа, имеющие ровно четыре различных натуральных делителя, не считая единицы и самого числа. Для каждого найденного числа запишите эти четыре делителя в четыре соседних столбца на экране с новой строки. Делители в строке должны следовать в порядке возрастания. Например, в диапазоне [10; 16] ровно четыре различных натуральных делителя имеет число 12, поэтому для этого диапазона вывод на экране должна содержать следующие значения: 2 3 4 6 Ответ:
Подсказка 1. Пойми, что требуется от числа: соответствие маске или свойство его натуральных делителей.
Подсказка 2. Маску проверяй через fnmatch по строке числа, а делители ищи перебором до корня из числа и добавляй сразу парный делитель.
Подсказка 3. Не включай само число, если сказано без него, и выводи ответ в нужном порядке. Ловушка — перебирать делители до самого числа и не уложиться во времени.
Разбор.
Решение. Решим задачу перебором. Будем проверять количество делителей каждого числа из диапазона, если их количество равно четырем — записываем их в массив d. Приведём решение на языке Pascal. var numDel, i, j: longint; d: array[1..4] of longint; begin for i := 210235 to 210300 do begin numDel := 0; for j := 2 to (i div 2) do begin if i mod j = 0 then begin numDel := numDel + 1; if numDel > 4 then break; d[numDel] := j; end; end; if numDel = 4 then writeln(d[1], ' ', d[2], ' ', d[3], ' ', d[4]); end; end. Приведём решение на языке Python. for i in range(210235,210301): k=0 a=[] for j in range(2,i//2+1): if i%j==0: k+=1 a.append(j) if k>4: break if k==4: print(a) В результате работы программа должна вывести следующее: 2 4 52561 105122 2 4 52567 105134 2 4 52571 105142 Приведём решение Игоря Орлова на языке PascalABC.NET. Uses School; begin Range(210235,210300).Where(x->x.Divisors.count=6).ForEach(x->Println(x.divisors[1]:3,x.divisors[2]:3,x.divisors[3]:6,x.divisors[4]:6)) end.