FunGame.Mod 3.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  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. Out.Int(x, 10); Out.Ln;
  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'); Texts.OpenScanner(S, T, 0);
  28. Texts.Scan(S); n := S.i;
  29. n := Parse(n);
  30. Texts.Open(T, ''); Texts.OpenWriter(W);
  31. Texts.WriteInt(W, n, 0); Texts.WriteLn(W);
  32. Texts.Append(T, W.buf); Texts.Close(T, 'fungame.out')
  33. END Do;
  34. BEGIN
  35. Do
  36. END FunGame.
  37. Забавная игра
  38. ~~~~~~~~~~~~~
  39. Задача D заочного тура Московской олимпиады по программированию, 2003.
  40. Время на тест - 1 секунда.
  41. Легендарный учитель математики Юрий Петрович придумал забавную игру с
  42. числами. А именно, взяв произвольное целое число, он переводит его в двоичную
  43. систему счисления, получая некоторую последовательность из нулей и единиц,
  44. начинающуюся с единицы (Например, десятичное число 19 в двоичной системе
  45. запишется как 10011). Затем учитель начинает сдвигать цифры полученного
  46. двоичного числа по циклу (так, что последняя цифра становится первой, а все
  47. остальные сдвигаются на одну позицию вправо), выписывая образующиеся при этом
  48. последовательности из нулей и единиц в столбик - он подметил, что независимо
  49. от выбора исходного числа получающиеся последовательности начинают с
  50. некоторого момента повторяться. И, наконец, Юрий Петрович отыскивает
  51. максимальное из выписанных чисел и переводит его обратно в десятичную систему
  52. счисления, считая это число результатом проделанных манипуляций. Так, для
  53. числа 19 список последовательностей будет таким:
  54. 10011
  55. 11001
  56. 11100
  57. 01110
  58. 00111
  59. 10011
  60. и результатом игры, следовательно, окажется число 28 (11100[2]). Поскольку
  61. придуманная игра с числами все больше занимает воображение учителя, отвлекая
  62. тем самым его от работы с ну очень одаренными школьниками, вас просят
  63. написать программу, которая бы помогла Юрию Петровичу получать результат игры
  64. без утомительных ручных вычислений.
  65. Входные данные:
  66. Программа получает на вход единственное натуральное число,
  67. не превосходящее 10^9.
  68. Выходные данные:
  69. Программа должна вывести единственное натуральное число - результат игры.