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

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

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

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

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

Полученная таким образом запись является двоичной записью искомого числа R. Например, исходное число 410 = 1002 преобразуется число 110002 = 4810, а исходное число 1310 = 11012 преобразуется в число 1101112 = 5510. Укажите такое число N большее 8, для которого число R является наименьшим среди чисел, превышающих 88. В ответе это число запишите в десятичной системе счисления.

Решение

Как обычно, приведем решения данной задачи через операции со строками и через эквивалентные целочисленные операции.

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

mn = 1000
mnn = 0
for n in range(9, 100):
    s = bin(n)[2:]
    if s[-1] == '0':
        s = '1' + s + '00'
    else:
        s += bin(s.count('1'))[2:]
    r = int(s, 2)
    if r > 88 and r < mn:
        mn = r
        mnn = n
print(mnn)

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

mn = 1000
mnn = 0
for n in range(9, 100):
    if n % 2 == 0:
        z = n
        k = 0
        while z > 0:
            k += 1
            z //= 2
        r = (2 ** k + n) * 4
    else:
        z = n
        sm = 0
        while z > 0:
            sm += z % 2
            z //= 2
        z = 2
        while z <= sm:
            z *= 2
        r = n * z + sm
    if r > 88 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;

function Count(s: String; c: Char): Integer;
var
    i: Integer;
begin
    result := 0;
    for i := 1 to s.Length do
        if s[i] = c then
            result := result + 1;
end;

var
    n, r, min, minn: Integer;
    s: String;
begin
    min := 1000;
    minn := 0;
    for n := 9 to 99 do
    begin
        s := Bin(n);
        if s[s.Length] = '0' then
            s := '1' + s + '00'
        else
            s := s + Bin(Count(s, '1'));
        r := Int(s, 2);
        if (r > 88) and (r < min) then
        begin
            min := r;
            minn := n;
        end;
    end;
    Writeln(minn);
end.

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

var
    n, r, z, k, sum, min, minn: Integer;
begin
    min := 1000;
    minn := 0;
    for n := 9 to 99 do
    begin
        if n mod 2 = 0 then
        begin
            z := n;
            k := 0;
            while z > 0 do
            begin
                k := k + 1;
                z := z div 2;
            end;
            r := (round(power(2, k)) + n) * 4;
        end
        else
        begin
            z := n;
            sum := 0;
            while z > 0 do
            begin
                sum := sum + z mod 2;
                z := z div 2;
            end;
            z := 2;
            while z <= sum do
                z := z * 2;
            r := n * z + sum;
        end;
        if (r > 88) 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 count(string s, char c)
{
    int n = 0;
    for (int i = 0; i < s.length(); i++)
        if (s[i] == c)
            n++;
    return n;
}

int main()
{
    int min = 1000, minn = 0;
    for (int n = 9; n < 100; n++)
    {
        string s = bin(n);
        if (s[s.length() - 1] == '0')
            s = "1" + s + "00";
        else
            s += bin(count(s, '1'));
        int r = to_int(s, 2);
        if (r > 88 && r < min)
        {
            min = r;
            minn = n;
        }
    }
    cout << minn << endl;
}

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

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

Ответ

25

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

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

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

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