Калужский Александр: Добрый вечер! Над этим нужно думать отде..
19-03-2023
Читать статью
Figh: Добрый вечер, можете сказать, что необхо..
Дмитрий: Всё понятно!!! Спасибо!..
14-03-2023
Сегодня посмотрим, что из себя представляет задание 22 из ЕГЭ по информатике.
Эта статья устаревшая! Обновлённую статью можете посмотреть здесь.
Решение 22 задания похоже на решение из 6 задания. Будем решать методом перебора на языке программирования Python. А так же будут приводится решения на языке Паскаль методом рассуждений. На Паскале так же можно решать с помощью перебора.
Приступаем к практике решения задач из 22 задания ЕГЭ по информатике.
Ниже на пяти языках записан алгоритм. Получив на вход число x, этот алгоритм печатает два числа: L и M. Укажите наименьшее из таких чисел x, при вводе которых алгоритм печатает сначала 8, а потом 13.
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).
Попробуем понять основную идею данной программы 22 задания из ЕГЭ по информатике.
В начале ввели с клавиатуры какое-то число и положили его в переменную x.
Затем начинается ЦИКЛ while. Пока x > 0, будет выполняться тело ЦИКЛА.
Внутри ЦИКЛА к переменной M прибавляется с каждой итерацией ЦИКЛА последняя цифра введённого числа x.
Примечание: Конструкция x mod 10 обозначает последнюю цифру.
В переменной y будет значение 7! Если 17 : 10 = 1 (ост. 7)
Далее идёт условие. Если последняя цифра x больше, чем предыдущее значение переменной L, то эта цифра становится новым значением переменной L.
Следующая и последняя команда внутри тела ЦИКЛА: x := x div 10, просто отбрасывает последнюю цифру числа x.
Примечание: Конструкция x div 10 удаляет последнюю цифру.
В переменной y будет значение 1! Если 17 : 10 = 1,7 - но дробную часть отбрасываем!
Подобные конструкции часто встречается в 22 задании ЕГЭ по информатике.
Таким образом, мы берём последнюю цифру, прибавляем её к переменной M, а затем отбрасываем её. И так будет происходить, пока x > 0 (пока у числа будут цифры).
Ещё в переменной L окажется самая большая цифра числа x!!
По условии задачи L = 8, а M = 13. Т.е. самая большая цифра числа x должна быть 8, а сумма всех цифр числа x должна быть 13.
Наименьшее число x получается 58.
Рассмотрим следующую задачу из ЕГЭ информатике.
Ниже на четырёх языках записан алгоритм. Получив на вход число x, этот алгоритм печатает два числа: a и b. Укажите наименьшее из таких чисел x, при вводе которого алгоритм печатает сначала 3, а потом 2
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.
Закрепим результаты по изучению 22 задания из ЕГЭ по информатике.
Ниже на пяти языках записан алгоритм. Получив на вход число x, этот алгоритм печатает два числа a и b. Укажите наибольшее из таких чисел x, при вводе которого алгоритм печатает сначала 2, а потом 5.
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 в десятичную систему.
Ответ будет 501.
Ниже приведён алгоритм. Укажите наибольшее число x, при вводе которого алгоритм напечатает сначала 3, потом 7.
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)
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!
Ниже приведён алгоритм. Укажите наибольшее число x, при вводе которого алгоритм напечатает сначала 3, потом 6.
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)
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 могут быть:
Ноль не может быть в нашем числе 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.