FunGame.Mod 4.0 KB

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