Тип Д6 № 33508 
Анализ программ. Условие выполнения цикла while. Часть 1
i
Определите, при каком наименьшем введённом значении переменной s программа выведет число 60. Для Вашего удобства программа представлена на четырёх языках программирования.
| Python | Си++ |
|---|
s = int(input()) s = (s + 1) // 7 n = 36 while s < 2050: s = s * 2 n = n + 3 print(n) | #include <iostream> using namespace std; int main() { int s; cin >> s; s = (s + 1) / 7; int n = 36; while (s < 2050) { s = s * 2; n = n + 3; } cout << n << endl; return 0; } |
| Паскаль | Алгоритмический язык |
|---|
var s, n: integer; begin readln(s); s := (s + 1) div 7; n := 36; while s < 2050 do begin s := s * 2; n := n + 3 end; writeln(n) end. | алг нач цел n, s ввод s s := div(s + 1, 7) n := 36 нц пока s < 2050 s := s * 2 n := n + 3 кц вывод n кон |
Решение. Заметим, что чтобы программа вывела число 60, к числу N = 36 должно прибавиться 24, т. е. цикл должен выполниться 8 раз. Поскольку в каждой итерации цикла число s умножается на 2, будем рассматривать степени двойки. Ближайшее к 2050 число, являющееся 2 в n-ной степени — 2048 = 211.
Число s + 1 в результате целочисленного деления на 7 должно давать результат >8. Значит, наименьшее возможное входное число s — 62.
Ответ: 62.
Приведем решение Михаила Глинского.
Заметим, что значение переменной s должно быть не меньше 6, поскольку иначе после выполнения команды s := (s + 1) div 7 получится 0, что приведет к зацикливанию. Составим программу на языке Паскаль для перебора значений s в порядке возрастания и выведем первое подходящее значение:
var s,i, n: integer;
begin
for i := 6 to 1000 do begin
s := i;
s := (s + 1) div 7;
n := 36;
while s < 2050 do begin
s := s * 2;
n := n + 3
end;
if n = 60 then begin
writeln(i); break;
end;
end;
end.
Приведём решение на языке Python.
def p(s):
s = (s + 1) // 7
n = 36
while s < 2050:
s = s * 2
n = n + 3
return n
t=6
while True:
if p(t)==60:
print(t)
break
t+=1
Приведём другое решение на языке Python.
for i in range(6, 10000): # начинаем с 6, так как при меньшем значение s происходит зацикливание
s = i
s = (s + 1) // 7
n = 36
while s < 2050:
s = s * 2
n = n + 3
if n == 60:
print(i)
break
Ответ: 62