Программное решение задач ЕГЭ по информатике

Задача 6702. Источник: Поляков. Задание КИМ 5

Страница задачи 6702

(М. Шагитов) На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом:

  1. Строится двоичная запись числа N.
  2. К этой записи дописываются разряды по следующему правилу. Если число N кратно 3, то справа дописываются три последние цифры двоичной записи; иначе остаток от деления числа N на 3 умножается на 3, переводится в двоичную систему и записывается в конец двоичной записи.
  3. Полученная таким образом запись является двоичной записью искомого числа R.

Например, для числа 12 двоичная запись 11002 преобразуется в запись 11001002 = 100, для числа 4 двоичная запись 1002 преобразуется в 100112 = 19. Укажите максимальное возможное значение R, меньшее 170, которое может быть получено с помощью этого алгоритма. В ответе запишите это число в десятичной системе счисления.

Решение

Как обычно, задача может быть решена через эквивалентные целочисленные операции и через операции со строками. На Python оба решения аналогичны по объему кода.

Python через строки

  1. mx = 0
  2. for n in range(4, 100):
  3. s = bin(n)[2:]
  4. if n % 3 == 0:
  5. s += s[-3:]
  6. else:
  7. s += bin(n % 3 * 3)[2:]
  8. r = int(s, 2)
  9. if r < 170:
  10. mx = max(mx, r)
  11. print(mx)

Python через целочисленные операции

  1. mx = 0
  2. for n in range(4, 100):
  3. if n % 3 == 0:
  4. r = n * 8 + n % 8
  5. elif n % 3 == 1:
  6. r = n * 4 + 3
  7. else:
  8. r = n * 8 + 6
  9. if r < 170:
  10. mx = max(mx, r)
  11. print(mx)

PascalABC через строки

  1. function Bin(n: Integer): String;
  2. begin
  3. result := '';
  4. while n > 0 do
  5. begin
  6. result := IntToStr((n mod 2)) + result;
  7. n := n div 2;
  8. end;
  9. if result = '' then
  10. result := '0';
  11. end;
  12. function Int(s: String; r: Integer := 10): Integer;
  13. var
  14. n, i: Integer;
  15. begin
  16. result := 0;
  17. n := 1;
  18. for i := s.Length downto 1 do
  19. begin
  20. result := result + StrToInt(s[i]) * n;
  21. n := n * r;
  22. end;
  23. end;
  24. var
  25. n, max, r: Integer;
  26. s: String;
  27. begin
  28. max := 0;
  29. for n := 4 to 99 do
  30. begin
  31. s := Bin(n);
  32. if n mod 3 = 0 then
  33. s := s + s[s.Length - 2:]
  34. else
  35. s := s + Bin(n mod 3 * 3);
  36. r := Int(s, 2);
  37. if (r < 170) and (r > max) then
  38. max := r;
  39. end;
  40. Writeln(max);
  41. end.

PascalABC через целочисленные операции

  1. var
  2. n, max, r: Integer;
  3. begin
  4. max := 0;
  5. for n := 4 to 99 do
  6. begin
  7. if n mod 3 = 0 then
  8. r := n * 8 + n mod 8
  9. else if n mod 3 = 1 then
  10. r := n * 4 + 3
  11. else
  12. r := n * 8 + 6;
  13. if (r < 170) and (r > max) then
  14. max := r;
  15. end;
  16. Writeln(max);
  17. end.

C++ через строки

  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. string bin(int n)
  5. {
  6. string s = "";
  7. while (n > 0)
  8. {
  9. s = to_string(n % 2) + s;
  10. n /= 2;
  11. }
  12. if (s == "")
  13. s = "0";
  14. return s;
  15. }
  16. int to_int(string s, int r)
  17. {
  18. int n = 0, z = 1;
  19. for (int i = s.length() - 1; i >= 0; i--)
  20. {
  21. n += ((int)s[i] - 48) * z;
  22. z *= r;
  23. }
  24. return n;
  25. }
  26. int main()
  27. {
  28. int max = 0;
  29. for (int n = 4; n < 100; n++)
  30. {
  31. string s = bin(n);
  32. if (n % 3 == 0)
  33. s = s + s.substr(s.length() - 3, 3);
  34. else
  35. s = s + bin(n % 3 * 3);
  36. int r = to_int(s, 2);
  37. if (r < 170 && r > max)
  38. max = r;
  39. }
  40. cout << max << endl;
  41. }

C++ через целочисленные операции

  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. int max = 0, r;
  6. for (int n = 1; n < 100; n++)
  7. {
  8. if (n % 3 == 0)
  9. r = n * 8 + n % 8;
  10. else if (n % 3 == 0)
  11. r = n * 4 + 3;
  12. else
  13. r = n * 8 + 6;
  14. if (r < 170 && r > max)
  15. max = r;
  16. }
  17. cout << max << endl;
  18. }

Ответ

166

Отправить замечание по решению

Код по которому имеется замечание:

Ваш вариант кода:

Комментарий: