Главная Посты Курсы Связь О сайте

ЕГЭ по информатике 2023 - Задание 22 (Не трудно!)



Сегодня посмотрим, что из себя представляет задание 22 из ЕГЭ по информатике.


Решение 22 задания похоже на решение из 6 задания. Будем решать методом перебора на языке программирования Python. А так же будут приводится решения на языке Паскаль методом рассуждений. На Паскале так же можно решать с помощью перебора.


Приступаем к практике решения задач из 22 задания ЕГЭ по информатике.



Задача (стандартная)

Ниже на пяти языках записан алгоритм. Получив на вход число x, этот алгоритм печатает два числа: L и M. Укажите наименьшее из таких чисел x, при вводе которых алгоритм печатает сначала 8, а потом 13.




БейсикPython
DIM X, M, L AS INTEGER
INPUT X
M = 0
L = 0
WHILE X > 0
    M = M + X MOD 10
    IF X MOD 10 > L THEN
        L = X MOD 10
    END IF
    X = X \ 10
WEND
PRINT L
PRINT M
x = int(input())
M = 0; L = 0
while x > 0:
    M = M + x % 10
    if x % 10 > L:
        L = x % 10
    x = x // 10
print(L)
print(M)
ПаскальАлгоритмический язык
var x, M, L: integer;
begin
    readln(x);
    M := 0; L := 0;
    while x > 0 do
    begin
        M := M + x mod 10;
        if x mod 10 > L then
            L := x mod 10;
        x := x div 10
    end;
    writeln(L); write(M)
end. 
алг
нач
    цел x, M, L
    ввод x
    M := 0
    L := 0
    нц пока x > 0
        M := M + mod(x, 10)
        если mod(x, 10) > L то
            L := mod(x, 10)
        все
    x := div(x, 10)
    кц
    вывод L, нс, M
кон
Си++
#include 
using namespace std;
int main() {
    int x, M, L;
    cin >> x;
    M = 0;
    L = 0;
    while (x > 0) {
        M = M + x % 10;
        if(x % 10 > L)
            L = x % 10;
        x = x / 10;
    }
    count << L << endl << M;
    return 0;
}  

Решение:

Открываем Phyton и копируем код задачи. Программа получает значение от пользователя в переменную x. Именно эту переменную мы и будем перебирать с помощью цикла. В данной задаче не указано, какие числа приходят на вход, поэтому разумно начать с отрицательных чисел. Обычно в таких задачах используются именно целые числа.


for i in range(-1000, 1000):
  x = i
  M = 0; L = 0 
  while x > 0:
    M = M + x % 10
    if x % 10 > L:
        L = x % 10
    x = x // 10
  if L==8 and M==13: print(i)

Вместо принтов в конце программы пишем условие. Переменные одновременно должны в конце равняться 8 и 13. В начале печатается переменная L, поэтому L равна 8, затем печается переменная М, она должна равняться 13.


Выбираем самое маленькое значение. Оно равно 58.


Решение на языке Паскаль (Pascal).


ЕГЭ по информатике 2023 - задание 22 (Разбор программы)

Попробуем понять основную идею данной программы 22 задания из ЕГЭ по информатике.


В начале ввели с клавиатуры какое-то число и положили его в переменную x.


Затем начинается ЦИКЛ while. Пока x > 0, будет выполняться тело ЦИКЛА.


Внутри ЦИКЛА к переменной M прибавляется с каждой итерацией ЦИКЛА последняя цифра введённого числа x.


Примечание:

Конструкция x mod 10 обозначает последнюю цифру.


Пример:

x := 17 ;
y := 17 mod 10 ;

В переменной y будет значение 7! Если 17 : 10 = 1 (ост. 7)


mod - это остаток от деления.

Далее идёт условие. Если последняя цифра x больше, чем предыдущее значение переменной L, то эта цифра становится новым значением переменной L.


Следующая и последняя команда внутри тела ЦИКЛА: x := x div 10, просто отбрасывает последнюю цифру числа x.


Примечание:

Конструкция x div 10 удаляет последнюю цифру.


Пример:

x := 17 ;
y := 17 div 10 ;

В переменной y будет значение 1! Если 17 : 10 = 1,7 - но дробную часть отбрасываем!


div - это целочисленное деление.

Подобные конструкции часто встречается в 22 задании ЕГЭ по информатике.


Таким образом, мы берём последнюю цифру, прибавляем её к переменной M, а затем отбрасываем её. И так будет происходить, пока x > 0 (пока у числа будут цифры).


Ещё в переменной L окажется самая большая цифра числа x!!


По условии задачи L = 8, а M = 13. Т.е. самая большая цифра числа x должна быть 8, а сумма всех цифр числа x должна быть 13.


Наименьшее число x получается 58.


Ответ: 58



Рассмотрим следующую задачу из ЕГЭ информатике.


Задача (связь с системами счисления)

Ниже на четырёх языках записан алгоритм. Получив на вход число x, этот алгоритм печатает два числа: a и b. Укажите наименьшее из таких чисел x, при вводе которого алгоритм печатает сначала 3, а потом 2


БейсикPython
DIM X, A, B AS INTEGER
 INPUT X
 A=0: B=0
 WHILE X > 0
    A = A+1
    IF B < (X MOD 8) THEN
        B = X MOD 8
    END IF
    X = X \ 8
 WEND
 PRINT A
 PRINT B
x = int(input())
a = 0
b = 0
while x > 0:
    a += 1
    if b < (x % 8):
        b =x % 8
    x //=  8
print(a)
print(b)
ПаскальСи++
var x, a, b: integer;
    begin
    readln(x);
    a:=0; b:=0;
    while x>0 do
    begin
        a:=a + 1;
        if b < (x mod 8)
        then
            b:=x mod 8;
        x:=x div 8;
    end;
    writeln(a); write(b);
end.
#include 
using namespace std;
int main()
{
    int x, a, b;
    cin >> x;
    a=0; b=0;
    while (x>0){
        a = a+1;
        if (b < (x%8){
            b = x%8;
        }
        x = x/8;
    }
    cout << a << endl << b << endl;
}

Решение:

Сначала решим перебором на языке Питон.


for i in range(-1000, 1000):
  x = i
  a = 0
  b = 0
  while x > 0:
    a += 1
    if b < (x % 8):
        b =x % 8
    x //=  8
  if a==3 and b==2: print(i)

Ответ получается 66.


Решение на языке Паскаль.


В этой задаче внутри ЦИКЛа while к переменной a прибавляется 1 с каждой итерацией.


Так же есть условие, благодаря которому, в переменной b будет наибольший остаток от деления числа x на 8. Причём с каждой итерацией число x уменьшается целочислено в 8 раз! (ведь следующая команда идёт x:=x div 8).


Разгадка: Помните, как мы переводим в восьмеричную систему из десятичной системы ? Мы делим на 8 и собираем остатки! Здесь та же самая картина! Получается, что в выражении x mod 8 будут поочерди находится все цифры числа x в восьмеричной системе! А в переменной b окажется самая большая цифра числа x в восьмеричной системе.


Значит, мы должны составить переменную x сначала в восьмеричной системе, где самая большая цифра будет 2, а количество цифр будет 3 (переменная a).


Такое число будет x = 1028.


Переводим это число в нашу десятичную систему и запишем ответ. 1028 -> 6610.


Ответ: 66



Закрепим результаты по изучению 22 задания из ЕГЭ по информатике.


Задача (закрепление)

Ниже на пяти языках записан алгоритм. Получив на вход число x, этот алгоритм печатает два числа a и b. Укажите наибольшее из таких чисел x, при вводе которого алгоритм печатает сначала 2, а потом 5.


БейсикPython
DIM X, A, B AS INTEGER
 INPUT X
 A = 0: B = 1
 WHILE X > 0
     A = A+1
     B = B * (X MOD 100)
     X = X\100
 WEND
 PRINT A
 PRINT B
x = int(input())
a, b = 0, 1
while x > 0:
    a = a + 1
    b = b * (x%100)
    x = x//100
print(a)
print(b)
ПаскальАлгоритмический язык
var x, a, b: integer;
begin
    readln(x);
    a := 0; b := 1;
    while x > 0 do
        begin
            a := a+1;
            b := b*(x mod 100);
            x := x div 100;
        end;
    writeln(a); write(b);
end.
алг
нач
цел x, a, b
ввод x
a:=0; b:=1
нц пока x > 0
    a := a+1
    b := b*mod(x,100)
    x := div(x,100)
кц
вывод a, нс, b
кон
Си++
#include 
using namespace std;
int main()
{
    int x, a, b;
    cin >> x;
    a = 0; b = 1;
    while (x > 0) {
        a = a+1;
        b = b * (x%100);
        x = x/100;
    }
   cout << a << endl << b << endl;
}

Решение:

Решение на Python. Т.к. нужно максимальное значение, возьмём верхнюю границу побольше. А нижнюю границу можно установить в ноль.


for i in range(0, 5000):
  x = i
  a, b = 0, 1
  while x > 0:
    a = a + 1
    b = b * (x%100)
    x = x//100
  if a==2 and b==5: print(i)

Ответ 501.


Решение на Паскаль. Эта задача похоже на предыдущую! Но теперь у нас выражение x mod 100 будет получать цифры 100-ричной системы числа x с каждой новой итерацией!


В переменной же b будет произведение всех цифр числа x в 100-ричной системе после окончания ЦИКЛА.


По условию задачи произведение цифр числа x в 100-ричной системе равно 5, а количество цифр равно 2 (за это отвечает переменная a). Нужно указать наибольшее число x! Нам подходит число 51100.


Переведём число 51100 в десятичную систему.


1 * 1000 + 5 * 1001 = 501

Ответ будет 501.


Ответ: 501



Задачи 22 задания из реального ЕГЭ по информатике.


Задача (ЕГЭ по информатике, 2019, Москва)

Ниже приведён алгоритм. Укажите наибольшее число x, при вводе которого алгоритм напечатает сначала 3, потом 7.


БейсикPython
DIM X, L, M AS INTEGER
INPUT X
L = 0
M = 0
WHILE X > 0
    M = M + 1
    IF X MOD 2 <> 0 THEN
        L = L + 1
    END IF
    X = X \ 2
WEND
PRINT L
PRINT M
x = int(input())
M = 0
L = 0
while x > 0:
    M = M + 1
    if x % 2 > 0:
        L = L + 1
    x = x // 2
print(L)
print(M)
ПаскальC++
var x, L, M : longint;
begin
    readln(x);
    M := 0;
    L := 0;
    while x > 0 do begin
        M := M + 1;
        if x mod 2 > 0 then
            L := L + 1;
        x := x div 2;
    end;
    writeln(L);
    writeln(M);
end.       
#include 
using namespace std;
int main() {
    int x, L, M ;
    cin >> x;
    M = 0;
    L = 0;
    while (x > 0) {
        M = M + 1;
        if(x % 2 > 0) {
            L = L + 1;
        }
        x = x / 2;        
    }
    cout << L << endl << M;
return 0;
}

Решение:

Решение на Python.

for i in range(0, 5000):
  x = i
  M = 0
  L = 0
  while x > 0:
    M = M + 1
    if x % 2 > 0:
        L = L + 1
    x = x // 2
  if L==3 and M==7: print(i)

Ответ получился 112.


Решение на Паскале.

Выражение x mod 2 может давать только два значения: либо 0, либо 1.


Следовательно, если остаток от деления x на 2 больше чем ноль, значит, в x mod 2 единица. Значит, в L подсчитывается количество единиц.


Переменная M подсчитывает количество всего итераций.


Если провести аналогию, что у нас есть число x в двоичной системе, то переменная L покажет, сколько в нём единиц, а переменная M - сколько всего разрядов в этом двоичном числе.


Нам нужно указать наибольшее x, где L = 3, а M = 7.


Получается, что такое число x будет 11100002. Если его перевести в десятичную систему, то получится 112!


Ответ: 112



Задача (ЕГЭ по информатике, 2020, Москва)

Ниже приведён алгоритм. Укажите наибольшее число x, при вводе которого алгоритм напечатает сначала 3, потом 6.


БейсикPython
DIM X, L, M AS INTEGER
INPUT X
M = 0
L = 1
WHILE X > 0
    M = M + 1
    IF X MOD 2 = 0 THEN
        L = L * (X MOD 8)
    END IF
    X = X DIV 8
WEND
PRINT M
PRINT L
x = int(input())
M = 0
L = 1
while x > 0:
    M = M + 1
    if x % 2 == 0:
        L = L * (x % 8)
    x = x // 8
print(M)
print(L)
ПаскальC++
var x, L, M : longint;
begin
  readln(x);
  M := 0;
  L := 1;
  while x > 0 do begin
     M := M + 1;
     if x mod 2 = 0 then
         L := L * (x mod 8);
     x := x div 8;
  end;
  writeln(M);
  writeln(L);
end.
#include 
using namespace std;
int main() {
  int x, L, M;
  cin >> x;
  M = 0;
  L = 1;
  while (x > 0) {
    M = M + 1;
    if(x % 2 = 0) {
        L = L * (x % 8)      
    }
    x = x / 8;
  cout << M << endl << L;
  }
return 0;
}

Решение:

Программа на Python.


for i in range(0, 5000):
  x = i
  M = 0
  L = 1
  while x > 0:
    M = M + 1
    if x % 2 == 0:
        L = L * (x % 8)
    x = x // 8
  if M==3 and L==6: print(i)

Ответ получается 510. Решим с помощью рассуждений.


Структура программы похожа на те, которые мы уже рассматривали!


Связка выражений x mod 8 и x div 8 подсказывает нам, что мы сначала должны подобрать x в восьмеричной системе!


В переменной L после выполнения всего ЦИКЛа будет произведение цифр числа x записанное в восьмеричной системе, но не всех, а только тех, которые равны 2, 4 или 6. Ведь команда L := L * (x mod 8); выполняется, если x нацело делится на 2!


Если x нацело делится на 2 (остаток от деления на 2 равен нулю), то остатки от деления на 8 могут быть:


10 : 8 = 1 (ост. 2)
12 : 8 = 1 (ост. 4)
14 : 8 = 1 (ост. 6)
16 : 8 = 2 (ост. 0)

Дальше остатки будут повторяться!

Ноль не может быть в нашем числе x записанное в восьмеричной системе, потому что, тогда бы, произведение цифр сразу стало бы равно нулю, а у нас переменная L = 6.


Переменная M характеризует количество цифр всего в числе x записанное в восьмеричной системе.


Итак, длина числа в восьмеричной системе должна равняться 3, а произведение цифр, которые могут быть равны 2, 4, 6 равно 6.


Если цифры не равны 2, 4, или 6, то они не участвуют в произведении и в формировании переменной L.


Нужно указать наибольшее число. В начале была L = 1. Получается, что в числе x8 только одна цифра 6 (1 * 6 = 6). Больше никак не получить произведение цифр равное 6, причём, чтобы множители можно было выбирать из цифр 2, 4, 6.


Таким образом, x8 = 7768. Это число трёхзначное, первые две цифры берём по максимуму, и так же должна обязательна быть цифра 6.


Переведём это число в десятичную систему. 7768 -> 51010.


Ответ: 510





23-07-2022 в 10:12:35







Поддержать сайт:

Похожая статья:

ЕГЭ по информатике 2021 - Задание 12 (Укрощение Робота)

Продолжаем подготовку к ЕГЭ по информатике нового формата 2021, и сего...

Категория: ЕГЭ  Подкатегория: -
Дата: 15-01-2018 в 16:47:34 1



Оставить коментарий:



Напишите email, чтобы получать сообщения о новых комментариях (необязательно):


Задача против робота. Расположите картинки горизонтально: