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