Задача 5900. Источник: Поляков. Задание КИМ 5
(А. Игнатюк) Компьютер по имени Иннокентий преобразует натуральное число N по следующим правилам и получает число R:
- Строится двоичная запись числа N.
- Если количество цифр в двоичной записи числа 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