СВЕТ: СПАСИБО
01-12-2023
Читать статью
Калужский Александр: Задача про Цаплю: https://www.youtube.co..
24-11-2023
Сергей: спасибо большое
Всем привет! Пришло время разбора 25 задания из ЕГЭ по информатике 2021.
Это задание требует умение программировать на каком-нибудь языке программирования, который разрешён на ЕГЭ по информатике 2021.
Приступим к практике решения примерных задач из ЕГЭ по информатике 2021.
Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [174457; 174505], числа, имеющие ровно два различных натуральных делителя, не считая единицы и самого числа. Для каждого найденного числа запишите эти два делителя в таблицу на экране с новой строки в порядке возрастания произведения этих двух делителей. Делители в строке таблицы также должны следовать в порядке возрастания.
Например, в диапазоне [5; 9] ровно два целых различных натуральных делителя имеют числа 6 и 8, поэтому для этого диапазона таблица на экране должна содержать следующие значения:
Напишем программу в Pascal ABC.
var i, j, d1, d2, count: integer; begin for i:=174457 to 174505 do begin // Перебираем числа из диапазона. d1:=1; d2:=1; count:=0; for j:=2 to i div 2 do begin // Ищем делители для конкретного числа if count > 2 then break; if (i mod j = 0) then begin if d1 = 1 then d1:=j else d2:=j; count:=count+1; end; end; if count = 2 then begin Writeln(d1, ' ', d2, ' ', d1*d2); // Распечатываем нужные числа. end; end; End.
Здесь мы перебираем все числа из нашего диапазона с помощью цикла for.
Для каждого числа устанавливаем первоначальные значения (переменные d1, d2, count). Переменная d1 - отвечает за первый делитель, переменная d2 - за второй, переменная count - за количество делителей.
Вторым циклом for мы проверяем для конкретного числа из диапазона, какие у него делители.
Достаточно проверить значения до "половины числа". Значения, которые больше "половины числа" не могут быть делителем числа (Кроме самого числа, но в условии написано, что само число не нужно засчитывать, как делитель).
Если d1=1, значит, мы нашли первый делитель, иначе второй делитель.
Если значение переменной count больше, чем 2, то можно выйти из цикла, и проверять следующее число из диапазона.
Печатаем делители числа и их произведение, если значение переменной count равно 2.
После запуска программы получаем ответ.
Разберём ещё одну примерную задачу из ЕГЭ по информатике 2021.
Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [33167; 33203], числа, имеющие хотя бы один натуральный трёхзначный делитель, у которого первая цифра и последняя цифра равны. Для каждого найденного числа запишите сначала само число, а затем найденный делитель в таблицу на экране с новой строки. Если таких делителей несколько, запишите наибольший.
Сами числа записать в порядке возрастания.
Например, в диапазоне [1000; 1010] ровно два целых числа, удовлетворяющих условию задачи. Поэтому для этого диапазона таблица на экране должна содержать следующие значения:
Напишем программу для решения данной задачки.
var i, j : integer; begin for i:=33167 to 33203 do begin // Перебираем числа из диапазона. for j:=100 to 999 do begin // Ищем делители if (i mod j = 0) and ( j mod 10 = j div 100) then begin Writeln(i, ' ', j); // Распечатываем нужные числа. end; end; end; end.
Делители должны быть трёхзначные, поэтому перебираем числа от 100 до 999. Проверяем, является ли число делителем для конкретного числа i из диапазона [33167; 33203]. Конструкция (j mod 10 = j div 100) проверяет равны ли первая цифра и последняя у натурального трёхзначного числа.
Продолжаем подготовку к 25 заданию из ЕГЭ по информатике 2021.
Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [32633; 32900], ровно два числа, имеющих максимальное количество натуральных делителей. Для каждого найденного числа запишите сначала само число, а затем количество делителей в таблицу на экране с новой строки.
Сами числа запишите в порядке возрастания.
Например, в диапазоне [1; 10] ровно два целых числа, удовлетворяющих условию задачи. Поэтому для этого диапазона таблица на экране должна содержать следующие значения:
Программа для данной задачи будет следующая:
var i, j, n1, n2, count_1, count_2, count : integer; begin count_1:=0; count_2:=0; n1 := 0; n2 := 0; for i:=32633 to 32900 do begin // Перебираем числа из диапазона. count:=0; for j:=1 to i div 2 do begin // Ищем делители if (i mod j = 0) then count:=count+1; end; if count>count_1 then begin if count>count_2 then begin count_1:=count_2; n1:=n2; count_2:=count; n2:=i; end else begin count_1:=count; n1:=i; end; end; end; Writeln(n1,' ', count_1+1); Writeln(n2,' ', count_2+1); end.
Раз нам нужно написать два числа, то заводим две переменные n1 и n2, а так же count_1 и count_2, где будут сохраняться количество делителей. В переменной count хранится количество делителей для каждого числа.
Механизм поиска двух максимальных значений: Проверяем больше ли переменная count, чем count_1. Если да, то нужно проверить, а вдруг она больше и чем count_2. Если она больше, чем count_2, мы значение, которое было в count_2 перекладываем в переменную count_1, а "победившее" count_2 значение записываем в саму переменную count_2.
Значения для переменных n1 и n2 в нашей задаче так же меняются, как и значения для переменных count_1 и count_2.
В конце мы прибавляем к переменным count_1 и count_2 по единице. Это делается из-за того, что мы проверяем числа до половины на то, являются ли они делители или нет. Но нужно учесть, что сами числа являются так же делителями.
Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [11166; 11241], числа, имеющие ровно три различных натуральных делителя, не считая единицы и самого числа, которые начинаются на цифру 1. Для каждого найденного числа запишите эти три делителя в таблицу на экране с новой строки в порядке возрастания произведения этих двух делителей. Делители в строке таблицы также должны следовать в порядке возрастания.
Например, в диапазоне [1; 100] таких числа ровно два, 60 и 90, поэтому для этого диапазона таблица на экране должна содержать следующие значения:
Задача похоже на демонстрационную версию ЕГЭ по информатике.
var i, j, d1, d2, d3, count, c, x: integer; begin for i:=11166 to 11241 do begin // Перебираем числа из диапазона. d1:=1; d2:=1; d3:=1; count:=0; for j:=2 to i div 2 do begin // Ищем делители для конкретного числа if count > 3 then break; if (i mod j = 0) then begin x:=j; c:=1; while x>0 do begin // Узнаём длину числа c:=c*10; x:=x div 10; end; c:=c div 10; if j div c = 1 then begin if d1 = 1 then d1:=j else begin if d2=1 then d2:=j else d3:=j; end; count:=count+1; end; end; end; if count = 3 then begin Writeln(d1, ' ', d2, ' ', d3, ' ', d1*d2*d3); // Распечатываем нужные числа. end; end; End.
Механизм определения трёх делителей берём из первой задачки.
Чтобы узнать первую цифру, например, числа 543, нужно применить операцию целочисленного деления 543 div 100 = 5. Поэтому формируем переменную с со значением 10^len и с помощью неё проверяем первую цифру.