Заметили ошибку ?
Выделите это место и нажмите Ctrl + Q

ЕГЭ по информатике - Задание 20 (Юбилейный выпуск)



Здравствуйте! Сегодня юбилейный, двадцатый урок по подготовке к ЕГЭ по информатике. Будем тренироваться решать 20 задание из ЕГЭ по информатике.


Двадцатое задание требует от учащегося разбираться в программном коде. Код будет как всегда дан на 4 или 5 языках программирования.


Начнём!


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

Ниже на пяти языках записан алгоритм. Получив на вход число 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;
}  

Решение:

Все задачи будем разбирать на языке паскаль.


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

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


В начале ввели с клавиатуры какое-то число и положили его в переменную 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 - это целочисленное деление.

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


Таким образом, мы берём последнюю цифру, прибавляем её к переменной 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;
}

Решение:

В этой задаче внутри ЦИКЛа 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

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


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

Ниже на пяти языках записан алгоритм. Получив на вход число 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;
}

Решение:

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


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


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


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


1 * 1000 + 5 * 1001 = 501

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


Ответ: 501

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


Задача (ЕГЭ по информатике, 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;
}

Решение:

Выражение 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;
}

Решение:

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


Связка выражений 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




10-08-2020 в 18:08:02





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

ЕГЭ по информатике 2021 - Задание 9 (Таблица Excel)

Девятое задание из ЕГЭ по информатике нового формата 2021 основывается...

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



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



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


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


Последние
видео:



ЕГЭ по информатике - Задание 9
ЕГЭ по информатике - Задание 8





Давайте
дружить!


Группа Вконтакте Code-Enjoy

Твиттер Александра Калужского

YouTube канал Code-Enjoy