22 (повышенный уровень, время – 7 мин)
Тема: Анализ программы, содержащей циклы и ветвления.
Что нужно знать:
перевод чисел в другие системы счисления
операции целочисленного деления (div) и взятия остатка (mod)
как работают операторы присваивания, циклы и условные операторы в языке программирования
Пример задания:
P-13 (демо-2021). Получив на вход число x, этот алгоритм печатает два числа: L и M. Укажите наибольшее число x, при вводе которого алгоритм печатает сначала 4, а потом 5.
var x, L, M, Q: integer;
begin
readln(x);
Q := 9;
L := 0;
while x = Q do begin
L := L + 1;
x := x - Q;
end;
M := x;
if M
M := L;
L := x;
end;
writeln(L);
writeln(M);
end.
Решение (программа):
если анализ алгоритма провести не удалось, можно попробовать найти подходящее значение перебором (методом «грубой силы», brute force)
для этого выполним следующие действия:
удаляем строчку, где вводится x:
readln(x);
вводим новую переменную x0 и заключаем основную часть программы в цикл
x0 := 1;
while True do begin
x := x0;
{ здесь нужно поместить запись основного алгоритма }
x0 := x0 + 1;
end;
можно использовать и цикл по переменной, если вы уверены, что максимальное значение, скажем, не больше 1000:
for x0:=1 to 1000 do begin
{ здесь нужно поместить запись основного алгоритма }
end;
заменяем строчки, в которых выводятся результаты, на проверку нужного нам случая; если должны быть выведены числа 4 и 5, выводим на экран число x0:
writeln(L);
writeln(M);
if (L = 4) and (M = 5) then
writeln(x0);
приведём полностью изменённую программу (добавленные строки выделены фоном):
var x0, x, L, M, Q: integer;
begin
for x0:=1 to 1000 do begin
// readln(x);
x := x0;
Q := 9;
L := 0;
while x = Q do begin
L := L + 1;
x := x - Q;
end;
M := x;
if M
M := L;
L := x;
end;
// writeln(L);
// writeln(M);
if (L = 4) and (M = 5) then
writeln(x0);
end;
end.
при запуске программа выдаёт два числа – 41 и 49.
Ответ: 49.
Решение (программа на языке Python):
for x0 in range(1,1001):
# x = int(input())
x = x0
Q = 9
L = 0
while x = Q:
L = L + 1
x = x - Q
M = x
if M
M = L
L = x
# print(L)
# print(M)
if L == 4 and M == 5:
print(x0)
Задачи для тренировки:
Ниже записана программа. Получив на вход число
, эта программа печатает два числа,
и
. Укажите наибольшее из таких чисел
, при вводе которых алгоритм печатает сначала 3, а потом 7.
var x, L, M: longint;
begin
readln(x);
L:=0; M:=0;
while x 0 do begin
L:= L + 1;
M:= M + x mod 10;
x:= x div 10;
end;
writeln(L); write(M);
end.
Ниже записана программа. Получив на вход число
, эта программа печатает два числа,
и
. Укажите наибольшее из таких чисел
, при вводе которых алгоритм печатает сначала 3, а потом 8.
var x, L, M: longint;
begin
readln(x);
L:=0; M:=0;
while x 0 do begin
L:= L + 1;
if x mod 2 = 0 then
M:= M + x mod 10;
x:= x div 10;
end;
writeln(L); write(M);
end.
Ниже записана программа. Получив на вход число
, эта программа печатает два числа,
и
. Укажите наибольшее из таких чисел
, при вводе которых алгоритм печатает сначала 3, а потом 0.
var x, L, M: longint;
begin
readln(x);
L:=0; M:=0;
while x 0 do begin
L:= L + 1;
if x mod 2 = 0 then
M:= M + x mod 10;
x:= x div 10;
end;
writeln(L); write(M);
end.
Ниже записана программа. Получив на вход число
, эта программа печатает два числа,
и
. Укажите наибольшее из таких чисел
, при вводе которых алгоритм печатает сначала 3, а потом 8.
var x, L, M: longint;
begin
readln(x);
L:=0; M:=0;
while x 0 do begin
L:= L + 1;
if x mod 2 = 1 then
M:= M + x mod 10;
x:= x div 10;
end;
writeln(L); write(M);
end.
Ниже записана программа. Получив на вход число
, эта программа печатает два числа,
и
. Укажите наибольшее из таких чисел
, при вводе которых алгоритм печатает сначала 3, а потом 7.
var x, L, M: longint;
begin
readln(x);
L:=0; M:=0;
while x 0 do begin
L:= L + 1;
if x mod 2 = 0 then
M:= M + (x mod 10) div 2;
x:= x div 10;
end;
writeln(L); write(M);
end.
Ниже записана программа. Получив на вход число
, эта программа печатает два числа,
и
. Укажите наибольшее из таких чисел
, при вводе которых алгоритм печатает сначала 3, а потом 7.
var x, L, M: longint;
begin
readln(x);
L:=0; M:=0;
while x 0 do begin
L:= L + 1;
if x mod 2 = 1 then
M:= M + (x mod 10) div 2;
x:= x div 10;
end;
writeln(L); write(M);
end.
Ниже записана программа. Получив на вход число
, эта программа печатает два числа,
и
. Укажите наибольшее из таких чисел
, при вводе которых алгоритм печатает сначала 3, а потом 7.
var x, L, M: longint;
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.