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

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

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

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

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

Например, для числа 11 троичная запись 1023 преобразуется в запись 102223 = 107, для числа 12 троичная запись 1103 преобразуется в 1110023 = 353. Укажите максимальное значение N, после обработки которого с помощью этого алгоритма получается число R, меньшее чем 199.

Решение

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

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

  1. mx = 0
  2. for n in range(1, 30):
  3. if n % 3 == 0:
  4. r = n * 9 + 2
  5. z = 1
  6. while z <= r:
  7. z *= 3
  8. r += z
  9. elif n % 3 == 1:
  10. r = n * 9 + 4
  11. else:
  12. r = n * 9 + 8
  13. if r < 199:
  14. mx = n
  15. print(mx)

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

  1. def ter(n):
  2. t = ''
  3. while n > 0:
  4. t = str(n % 3) + t
  5. n //= 3
  6. return t
  7. mx = 0
  8. for n in range(1, 30):
  9. s = ter(n)
  10. if n % 3 == 0:
  11. s = '1' + s + '02'
  12. else:
  13. s += ter(n % 3 * 4)
  14. r = int(s, 3)
  15. if r < 199:
  16. mx = n
  17. print(mx)

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

  1. var
  2. n, max, r, z: Integer;
  3. begin
  4. max := 0;
  5. for n := 1 to 29 do
  6. begin
  7. if n mod 3 = 0 then
  8. begin
  9. r := n * 9 + 2;
  10. z := 1;
  11. while z <= r do
  12. z := z * 3;
  13. r := r + z;
  14. end
  15. else if n mod 3 = 1 then
  16. r := n * 9 + 4
  17. else
  18. r := n * 9 + 8;
  19. if r <199 then
  20. max := n;
  21. end;
  22. Writeln(max);
  23. end.

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

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

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

  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. int max = 0, r;
  6. for (int n = 1; n < 30; n++)
  7. {
  8. if (n % 3 == 0)
  9. {
  10. r = n * 9 + 2;
  11. int z = 1;
  12. while (z <= r)
  13. z *= 3;
  14. r += z;
  15. }
  16. else if (n % 3 == 0)
  17. r = n * 9 + 4;
  18. else
  19. r = n * 9 + 8;
  20. if (r < 199)
  21. max = n;
  22. }
  23. cout << max << endl;
  24. }

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

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

Ответ

20

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

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

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

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