Алгоритм получает на вход натуральное число N и строит по нему новое число R следующим образом:
1. Строится двоичная запись числа N.
2. В конец двоичной записи добавляются две цифры, соответствующие двоичной записи остатка от деления исходного числа
3. В конец двоичной записи числа, полученного на предыдущем шаге, добавляются три цифры, соответствующие двоичной записи остатка от деления этого числа
4. Результатом работы алгоритма становится десятичная запись полученного числа R.
Пример. Дано число N = 13. Алгоритм работает следующим образом:
1. Строим двоичную запись: 1310 = 11012.
2. Остаток от деления 13
3. Остаток от деления 53
4. Результат работы алгоритма R = 427.
Определите количество принадлежащих отрезку [1 222 222 222; 1 555 555 666] чисел, которые могут получиться в результате работы этого алгоритма.
Заметим, что алгоритм дописывает пять двоичных разрядов в конец. Достаточно отбросить пять разрядов в двоичной записи чисел границ получившегося отрезка и посчитать количество чисел в исходном отрезке. Составим программу.
Приведём решение на языке Python.
print(int(bin(1555555666)[2:][:-5], 2) - int(bin(1222222222)[2:][:-5], 2) -1)
Ответ: 10416669.
Приведём решение Дмитрия Гнутова на языке Python.
def triam (N):
N2 = N * 4 + N % 3
R = N2 * 8 + N2 % 5
return (R)
a = 1222222222
b = 1555555666
minim = a//32 - 1
while triam(minim) < a:
minim += 1
maximum = b//32 + 1
while triam(maximum) > b:
maximum -= 1
print (maximum - minim + 1)
Приведём решение Бориса Савельева на языке Python.
count = 0
for n in range (38190000,49000000):
s = bin(n)[2:]
if n % 3 <= 1:
s = s + '0' + bin(n%3)[2:]
else:
s = s + bin(n%3)[2:]
r = int(s,2)
if r%5 <= 1:
s = s + '00' + bin(r % 5)[2:]
elif r % 5 <= 3:
s = s + '0' + bin(r % 5)[2:]
else:
s = s + bin(r % 5)[2:]
r = int(s, 2)
if r >= 1222222222 and r <= 1555555666:
count += 1
print(count)

