Просмотр содержимого документа
«21.2.Ещё пример задания»
Ещё пример задания:
Ниже записана программа. Получив на вход число , эта программа печатает два числа, и . Укажите наибольшее из таких чисел , при вводе которых алгоритм печатает сначала 3, а потом 7.
var x, L, M: integer;
begin
readln(x);
L:=0; M:=0;
while x 0 do begin
L:=L+1;
if M
M:=x mod 10;
end;
x:= x div 10;
end;
writeln(L); write(M);
end.
Решение:
для решения задачи необходимо понять, что делает эта программа
если это не видно сразу, можно выполнить ручную прокрутку для какого-то простого числа, например, для числа 251:
оператор | условие | x | L | M |
readln(x); | | 251 | ? | ? |
L:=0; M:=0; | | | 0 | 0 |
while x 0 do… | 251 0? да | | | |
L:=L+1; | | | 1 | |
if M | M 51 mod 10)? да | | | |
M:=x mod 10; | | | | 1 |
x:=x div 10; | | 25 | | |
while x 0 do… | 25 0? да | | | |
L:=L+1; | | | 2 | |
if M | M 25 mod 10)? да | | | |
M:=x mod 10; | | | | 5 |
x:=x div 10; | | 2 | | |
while x 0 do… | 2 0? да | | | |
L:=L+1; | | | 3 | |
if M | M mod 10)? нет | | | |
x:=x div 10; | | 0 | | |
while x 0 do… | 0 0? нет | | | |
writeln(L); write(M); | | | 3 | 5 |
можно догадаться, что в результате работы программы в переменной L окажется число цифр числа, а в переменной M – наибольшая цифра, но это предположение нужно постараться доказать
нужно вспомнить (и запомнить), что для целого числа остаток от деления на 10 (x mod 10) – это последняя цифра в десятичной записи числа, а целочисленное деление (x div 10) отсекает последнюю цифру, то есть из 123 получается 12
рассмотрим цикл, число шагов которого зависит от изменения переменной x:
while x 0 do begin
...
x:= x div 10; { отсечение последней цифры }
end;
здесь оставлены только те операторы, которые влияют на значение x
из приведенного цикла видно, что на каждом шаге от десятичной записи x отсекается последняя цифра до тех пор, пока все цифры не будут отсечены, то есть x не станет равно 0; поэтому цикл выполняется столько раз, сколько цифр в десятичной записи введенного числа
на каждом шаге цикла переменная L увеличивается на 1:
L:=L+1;
других операторов, меняющих значение L, в программе нет; поэтому после завершения цикла в переменной L действительно находится количество цифр
теперь разберемся с переменной M, которая сначала равна 0; оператор, в котором она меняется, выглядит так:
if M
M:=x mod 10;
end;
учитывая, что x mod 10 – это последняя цифра десятичной записи числа, получается что если эта цифра больше, чем значение M, она записывается в переменную M;
этот оператор выполняется в цикле, причем выражение x mod 10 по очереди принимает значения всех цифр исходного числа; поэтому после завершения циклам в переменной M окажется наибольшая из всех цифр, то есть наша догадка подтверждается
итак, по условию задачи фактически требуется найти наибольшее трехзначное число, в котором наибольшая цифра – 7; очевидно, что это 777.
ответ: 777.
Возможные ловушки и проблемы: это очень неплохая задача на понимание, тут достаточно сложно «вызубрить» метод решения, можно только освоить последовательность (системность) анализа ручной прокрутки в такой задаче недостаточно, по её результатам можно угадать алгоритм, но можно и не угадать; в критическом случае можно сделать ручную прокрутку для нескольких чисел им попытаться понять закономерность |