FunGame.Mod 3.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. MODULE FunGame;
  2. IMPORT Texts, Out;
  3. PROCEDURE LastBit(x: INTEGER): INTEGER;
  4. VAR k: INTEGER;
  5. BEGIN k := 1;
  6. WHILE k <= x DO k := k * 2 END
  7. RETURN k DIV 2 END LastBit;
  8. PROCEDURE Rotate(x, k: INTEGER): INTEGER;
  9. RETURN x DIV 2 + ORD(ODD(x)) * k END Rotate;
  10. PROCEDURE Parse(x: INTEGER): INTEGER;
  11. VAR x0, k, max: INTEGER;
  12. BEGIN
  13. x0 := x; max := x;
  14. k := LastBit(x); (* k - максимальная степень двойки такая, что k <= x *)
  15. REPEAT
  16. x := Rotate(x, k);
  17. IF x > max THEN max := x END
  18. UNTIL x = x0
  19. RETURN max END Parse;
  20. PROCEDURE Do;
  21. VAR T: Texts.Text;
  22. S: Texts.Scanner;
  23. W: Texts.Writer;
  24. n: INTEGER;
  25. BEGIN
  26. NEW(T); Texts.Open(T, 'fungame.in');
  27. IF T.len # 0 THEN
  28. Texts.OpenScanner(S, T, 0); Texts.Scan(S);
  29. n := S.i;
  30. n := Parse(n);
  31. Texts.Open(T, ''); Texts.OpenWriter(W);
  32. Texts.WriteInt(W, n, 0); Texts.WriteLn(W);
  33. Texts.Append(T, W.buf); Texts.Close(T, 'fungame.out')
  34. END
  35. END Do;
  36. BEGIN
  37. Do
  38. END FunGame.
  39. Забавная игра
  40. ~~~~~~~~~~~~~
  41. Задача D заочного тура Московской олимпиады по программированию, 2003.
  42. Время на тест - 1 секунда.
  43. Легендарный учитель математики Юрий Петрович придумал забавную игру с
  44. числами. А именно, взяв произвольное целое число, он переводит его в двоичную
  45. систему счисления, получая некоторую последовательность из нулей и единиц,
  46. начинающуюся с единицы (Например, десятичное число 19 в двоичной системе
  47. запишется как 10011). Затем учитель начинает сдвигать цифры полученного
  48. двоичного числа по циклу (так, что последняя цифра становится первой, а все
  49. остальные сдвигаются на одну позицию вправо), выписывая образующиеся при этом
  50. последовательности из нулей и единиц в столбик - он подметил, что независимо
  51. от выбора исходного числа получающиеся последовательности начинают с
  52. некоторого момента повторяться. И, наконец, Юрий Петрович отыскивает
  53. максимальное из выписанных чисел и переводит его обратно в десятичную систему
  54. счисления, считая это число результатом проделанных манипуляций. Так, для
  55. числа 19 список последовательностей будет таким:
  56. 10011
  57. 11001
  58. 11100
  59. 01110
  60. 00111
  61. 10011
  62. и результатом игры, следовательно, окажется число 28 (11100[2]). Поскольку
  63. придуманная игра с числами все больше занимает воображение учителя, отвлекая
  64. тем самым его от работы с ну очень одаренными школьниками, вас просят
  65. написать программу, которая бы помогла Юрию Петровичу получать результат игры
  66. без утомительных ручных вычислений.
  67. Входные данные:
  68. Программа получает на вход единственное натуральное число,
  69. не превосходящее 10^9.
  70. Выходные данные:
  71. Программа должна вывести единственное натуральное число - результат игры.