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

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

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

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

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

Например, для числа 13 = 11012 получается 11011012 = 109, для числа 9 двоичная запись 10012 преобразуется в 10010102 = 74. Укажите значение N, в результате обработки которого будет получено минимально возможное четное значение R, большее 300. Если таких значений несколько, приведите минимальное подходящее значение.

Решение

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

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

mn = 1000
mnn = 0
for n in range(1, 100):
    s = bin(n)[2:]
    if n % 3 == 0:
        s += '010'
    else:
        s += bin(n % 3 * 5)[2:]
    r = int(s, 2)
    if r > 300 and r % 2 == 0 and r < mn:
        mn = r
        mnn = n
print(mnn)

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

mn = 1000
mnn = 0
for n in range(1, 100):
    if n % 3 == 0:
        r = n * 8 + 2
    elif n % 3 == 1:
        r = n * 8 + 5
    else:
        r = n * 16 + 10
    if r > 300 and r % 2 == 0 and r < mn:
        mn = r
        mnn = n
print(mnn)

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

function Bin(n: Integer): String;
begin
    result := '';
    while n > 0 do
    begin
        result := IntToStr((n mod 2)) + result;
        n := n div 2;
    end;
    if result = '' then
        result := '0';
end;

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, min, minn, r: Integer;
    s: String;
begin
    min := 1000;
    minn := 0;
    for n := 1 to 99 do
    begin
        s := Bin(n);
        if n mod 3 = 0 then
            s := s + '010'
        else
            s := s + Bin(n mod 3 * 5);
        r := Int(s, 2);
        if (r > 300) and (r mod 2 = 0) and (r < min) then
        begin
            min := r;
            minn := n;
        end;
    end;
    Writeln(minn);
end.

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

var
    n, min, minn, r: Integer;
begin
    min := 1000;
    minn := 0;
    for n := 1 to 99 do
    begin
        if n mod 3 = 0 then
          r := n * 8 + 2
        else if n mod 3 = 1 then
            r := n * 8 + 5
        else
            r := n * 16 + 10;
        if (r > 300) and (r mod 2 = 0) and (r < min) then
        begin
            min := r;
            minn := n;
        end;
    end;
    Writeln(minn);
end.

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

#include <iostream>
#include <string>
using namespace std;
string bin(int n)
{
    string s = "";
    while (n > 0)
    {
        s = to_string(n % 2) + s;
        n /= 2;
    }
    if (s == "")
        s = "0";
    return s;
}

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 min = 1000, minn = 0;
    for (int n = 1; n < 100; n++)
    {
        string s = bin(n);
        if (n % 3 == 0)
            s += "010";
        else
            s += bin(n % 3 * 5);
        int r = to_int(s, 2);
        if (r > 300 && r % 2 == 0 && r < min)
        {
            min = r;
            minn = n;
        }
    }
    cout << minn << endl;
}

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

#include <iostream>
using namespace std;
int main()
{
    int min = 1000, minn = 0, r;
    for (int n = 1; n < 100; n++)
    {
        if (n % 3 == 0)
            r = n * 8 + 2;
        else if (n % 3 == 1)
            r = n * 8 + 5;
        else
            r = n * 16 + 10;
        if (r > 300 && r % 2 == 0 && r < min)
        {
            min = r;
            minn = n;
        }
    }
    cout << minn << endl;
}

Ответ

39

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

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

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

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