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

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

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

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

  1. Строится четверичная запись числа N
  2. В конец записи (справа) дописывается остаток от деления числа N на 3, а в начало записи (слева) остаток от деления N на 2.
  3. Результат переводится из четверичной системы в десятичную и выводится на экран.

Пример. Дано число N=23. Алгоритм работает следующим образом: 23 → 1134 → 111324 → 350. Какое наибольшее двузначное число может появиться на экране в результате работы этого алгоритма?

Решение

Редкий случай, когда решение через эквивалентные целочисленные операции даже на Python немного меньше, чем решение через строки.

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

mx = 0
for n in range(1, 100):
    z = n
    k = 0
    while z > 0:
        k += 1
        z //= 4
    r = (n % 2 * 4 ** k + n) * 4 + n % 3
    if 9 < r < 100:
        mx = max(mx, r)
print(mx)

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

mx = 0
for n in range(1, 100):
    z = n
    s = ''
    while z > 0:
        s = str(z % 4) + s
        z //= 4
    s = str(n % 2) + s + str(n % 3)
    r = int(s, 4)
    if 9 < r < 100:
        mx = max(mx, r)
print(mx)

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

var
    n, r, z, k, max: Integer;
begin
    max := 0;
    for n := 1 to 99 do
    begin
        z := n;
        k := 0;
        while z > 0 do
        begin
            k := k + 1;
            z := z div 4;
        end;
        r := (n mod 2 * round(power(4, k)) + n) * 4 + n mod 3;
        if (r > 9) and (r < 100) and (r > max) then
            max := r;
    end;
    Writeln(max);
end.

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

function Int(s: String; r: Integer := 10): Integer;
var
    n, i: Integer;
begin
    result := 0;
    n := 1;
    for i := s.Length downto 1 do
    begin
        result := result + StrToInt(s[i]) * n;
        n := n * r;
    end;
end;

var
    n, r, z, max: Integer;
    s: String;
begin
    max := 0;
    for n := 1 to 99 do
    begin
        z := n;
        s := '';
        while z > 0 do
        begin
            s := IntToStr(z mod 4) + s;
            z := z div 4;
        end;
        s := IntToStr(n mod 2) + s + IntToStr(n mod 3);
        r := Int(s, 4);
        if (r > 9) and (r < 100) and (r > max) then
            max := r;
    end;
    Writeln(max);
end.

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

#include <iostream>
#include <cmath>
using namespace std;
int main()
{
    int max = 0;
    for (int n = 4; n < 100; n++)
    {
        int z = n, k = 0;
        while (z > 0)
        {
            k++;
            z /= 4;
        }
        int r = (n % 2 * (int)pow(4, k) + n) * 4 + n % 3;
        if (r > 9 && r < 100 && r > max)
            max = r;
    }
    cout << max << endl;
}

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

#include <iostream>
#include <string>
using namespace std;

int to_int(string s, int r)
{
    int n = 0, z = 1;
    for (int i = s.length() - 1; i >= 0; i--)
    {
        n += ((int)s[i] - 48) * z;
        z *= r;
    }
    return n;
}

int main()
{
    int max = 0;
    for (int n = 1; n < 100; n++)
    {
        int z = n;
        string s = "";
        while (z > 0)
        {
            s = to_string(z % 4) + s;
            z /= 4;
        }
        s = to_string(n % 2) + s + to_string(n % 3);
        int r = to_int(s, 4);
        if (r > 9 && r < 100 && r > max)
            max = r;
    }
    cout << max << endl;
}

Ответ

96

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

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

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

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