Разбор задачи B7 (демо ЕГЭ 2012)
Ниже на 4-х языках записан алгоритм. Получив на вход число x, этот алгоритм печатает два числа L и M. Укажите наибольшее из таких чисел x, при вводе которых алгоритм печатает сначала 3, а потом 7.
Бейсик | Паскаль |
---|---|
DIM X, L, M AS INTEGER INPUT X L=0: M=0 WHILE X > 0 L = L+1 IF M < (X MOD 10) THEN M = X MOD 10 ENDIF X = X \ 10 WEND PRINT L PRINT M |
var x, L, M: integer; begin readln(x); L:=0; M:=0; while x>0 do begin L:=L+1; if M < (x mod 10) then begin M:=x mod 10; end; x:= x div 10; end; writeln(L); write(M); end. |
Си | Алгоритмический язык |
#include<stdio.h> void main() { int x, L, M; scanf("%d", &x); L=0; M=0; while (x>0){ L=L+1; if M < x % 10 { M = x % 10 } x= x/10; } printf("%d\n%d", L, M); } |
алг нач цел x, L, M ввод x L:=0; M:=0 нц пока x>0 L:=L+1 если M < mod(x,10) то M:= mod(x,10) все x:=div(x,10) кц вывод L, нс, M кон |
В программе работает один цикл while c условием: x>0. В каждом проходе цикла делим x на 10. и Делаем проходы до тех пор, пока x>0. В последнем проходе x станет равным нулю, а точнее меньше 1-цы, т.к. x задан как целое, значит дробная часть отбрасывается. Получается, что на входе последнего цикла x<10. Например,если б х был равен 2,то 2\10=0 (дробная часть отбрасывается). Значит,последний остаток и равен х, который был на входе последнего прохода.
L хранит число,которое показывает сколько проходов было выполнено в цикле. в M записываем наибольший остаток от деления x на 10.
"алгоритм печатает сначала 3, а потом 7". Значит, L=3, M=7. Было выполнено 3 прохода. И наибольший остаток из трех равен 7. Нам нужно определить наибольшее введенное в программу х, значит все остатки должны быть максимальны, и поэтому они равны 7. М при всех 3-х проходах равно 7.
Получаем, на входе третьего прохода х=7, второго-х=77, первого-х=777. Последнее х и есть искомое.