Тип Д22 № 6781 
Раздел кодификатора ФИПИ: Анализ программы с циклами и условными операторами .Посимвольная обработка восьмеричных чисел
i
Ниже на пяти языках записан алгоритм. Получив на вход число x, этот алгоритм печатает два числа: a и b. Укажите наименьшее из таких чисел x, при вводе которого алгоритм печатает сначала 3, а потом 2.
| Бейсик | Паскаль |
|---|
DIM X, A, B AS INTEGER INPUT X A=0: B=0 WHILE X > 0 A = A+1 IF B < (X MOD 8) THEN B = X MOD 8 END IF X = X \ 8 WEND PRINT A PRINT B | 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. |
| Си++ | Алгоритмический |
|---|
#include <iostream> using namespace std; int main() { int x, a, b; cin >> x; a=0; b=0; while (x>0){ a = a+1; if (b < (x%8)){ b = x%8; } x = x/8; } cout << a << endl << b << endl; } | алг нач цел x, a, b ввод x a:=0; b:=0 нц пока x>0 a:=a+1 если b < mod(x,8) то b:=mod(x,8) все x:=div(x,8) кц вывод a, нс, b кон |
| Python |
|---|
x = int(input()) a = 0 b = 0 while x > 0: a += 1 if (b < (x % 8)): b =x % 8 x //= 8 print(a) print(b) |
Решение. Значение в переменной a после выполнения цикла равно количеству выполненных циклов. Поскольку требуется, чтобы программа напечатала сначала число 3, цикл должен выполниться три раза. Оператор div оставляет только целую часть от деления, следовательно, искомое число должно два раза делиться на 8 так, чтобы целая часть результата была положительной. Следовательно, это число должно быть не меньше числа 64.
В переменную b записывается остаток от деления числа на 8. По условию требуется, чтобы после выполнения цикла переменная b имела значение 2, т. е. максимальный остаток от деления на 8 в цикле должен быть равен 2.
Выполним программу для всех чисел, не меньших чем 64. Первое число, которое удовлетворит условию и будет наименьшим. Поскольку программа выводит целые числа и никаких других операторов к числу, кроме операторов div и mod, не применяется, будем рассматривать только целые числа.
При вводе числа 64 программа выведет числа 3 и 1. При вводе числа 65 программа выведет числа 3 и 1. При вводе числа 66 программа выведет числа 3 и 2. Следовательно, ответ 66.
Ответ: 66.
Приведём другое решение на языке Python.
for i in range(1, 1000):
x = i
a = 0
b = 0
while x > 0:
a += 1
if b < (x % 8):
b = x % 8
x //= 8
if a == 3 and b == 2:
print(i)
break
Ответ: 66
Раздел кодификатора ФИПИ: