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

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

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

(А. Игнатюк) Компьютер по имени Иннокентий преобразует натуральное число N по следующим правилам и получает число R:

  1. Строится двоичная запись числа N.
  2. Если количество цифр в двоичной записи числа N четно, то справа приписывается 10, если нечётно, то слева приписывается 11.

Полученная таким образом запись является двоичной записью искомого числа R. Найдите количество чисел N из отрезка [100; 200], для которых результат работы компьютера будет четным.

Решение

В данной задаче нет необходимости реализовывать сам алгоритм, достаточно анализа исходного числа. Это значительно сокращает объем кода. Как и в большинстве других задач, решение возможно через операции со строками и через эквивалентные целочисленные операции.

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

k = 0
for n in range(100, 201):
    s = bin(n)[2:]
    if len(s) % 2 == 0 or len(s) % 2 == 1 and s[-1] == '0':
        k += 1
print(k)

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

k = 0
for n in range(100, 201):
    z = n
    c = 0
    while z > 0:
        c += 1
        z //= 2
    if c % 2 == 0 or c % 2 ==  1 and n % 2 == 0:
        k += 1
print(k)

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;

var
    n, k: Integer;
    s: String;
begin
    k := 0;
    for n := 100 to 200 do
    begin
        s := Bin(n);
        if (s.Length mod 2 = 0) or (s.Length mod 2 = 1) and (s[s.Length] = '0') then
            k := k + 1;
    end;
    Writeln(k);
end.

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

var
    n, k, z, c: Integer;
begin
    k := 0;
    for n := 100 to 200 do
    begin
        z := n;
        c := 0;
        while z > 0 do
        begin
            c := c + 1;
            z := z div 2;
        end;
        if  (c mod 2 = 0) or (c mod 2 = 1) and ( n mod 2 = 0) then
            k := k + 1;
    end;
    Writeln(k);
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 main()
{
    int k = 0;
    for (int n = 100; n < 201; n++)
    {
        string s = bin(n);
        if (s.length() % 2 == 0 || s.length() % 2 == 1 && s[s.length() - 1] == '0')
            k++;
    }
    cout << k << endl;
}

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

#include <iostream>
using namespace std;
int main()
{
    int k = 0;
    for (int n = 100; n < 201; n++)
    {
        int z = n, c = 0;
        while (z > 0)
        {
            c++;
            z /= 2;
        }
        if (c % 2 == 0 || c % 2 == 1 and n % 2 == 0)
            k++;
    }
    cout << k << endl;
}

Ответ

87

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

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

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

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