(* Это не игра, а пример решения олимпиадной задачи по программированию. *) MODULE FunGame; IMPORT Texts, Out; PROCEDURE LastBit(x: INTEGER): INTEGER; VAR k: INTEGER; BEGIN k := 1; WHILE k <= x DO k := k * 2 END RETURN k DIV 2 END LastBit; PROCEDURE Rotate(x, k: INTEGER): INTEGER; RETURN x DIV 2 + ORD(ODD(x)) * k END Rotate; PROCEDURE Parse(x: INTEGER): INTEGER; VAR x0, k, max: INTEGER; BEGIN x0 := x; max := x; k := LastBit(x); (* k - максимальная степень двойки такая, что k <= x *) REPEAT x := Rotate(x, k); IF x > max THEN max := x END UNTIL x = x0 RETURN max END Parse; PROCEDURE Do; VAR T: Texts.Text; S: Texts.Scanner; W: Texts.Writer; n: INTEGER; BEGIN NEW(T); Texts.Open(T, 'fungame.in'); IF T.len # 0 THEN Texts.OpenScanner(S, T, 0); Texts.Scan(S); n := S.i; n := Parse(n); Texts.Open(T, ''); Texts.OpenWriter(W); Texts.WriteInt(W, n, 0); Texts.WriteLn(W); Texts.Append(T, W.buf); Texts.Close(T, 'fungame.out') END END Do; BEGIN Do END FunGame. Забавная игра ~~~~~~~~~~~~~ Задача D заочного тура Московской олимпиады по программированию, 2003. Время на тест - 1 секунда. Легендарный учитель математики Юрий Петрович придумал забавную игру с числами. А именно, взяв произвольное целое число, он переводит его в двоичную систему счисления, получая некоторую последовательность из нулей и единиц, начинающуюся с единицы (Например, десятичное число 19 в двоичной системе запишется как 10011). Затем учитель начинает сдвигать цифры полученного двоичного числа по циклу (так, что последняя цифра становится первой, а все остальные сдвигаются на одну позицию вправо), выписывая образующиеся при этом последовательности из нулей и единиц в столбик - он подметил, что независимо от выбора исходного числа получающиеся последовательности начинают с некоторого момента повторяться. И, наконец, Юрий Петрович отыскивает максимальное из выписанных чисел и переводит его обратно в десятичную систему счисления, считая это число результатом проделанных манипуляций. Так, для числа 19 список последовательностей будет таким: 10011 11001 11100 01110 00111 10011 и результатом игры, следовательно, окажется число 28 (11100[2]). Поскольку придуманная игра с числами все больше занимает воображение учителя, отвлекая тем самым его от работы с ну очень одаренными школьниками, вас просят написать программу, которая бы помогла Юрию Петровичу получать результат игры без утомительных ручных вычислений. Входные данные: Программа получает на вход единственное натуральное число, не превосходящее 10^9. Выходные данные: Программа должна вывести единственное натуральное число - результат игры.