Условие: № 5589 (Уровень: Средний) На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом. а) если количество разрядов в числе чётное, тогда в центр записи числа дописывается 111.
б) если количество разрядов в числе нечётное, тогда к этой записи справа дописывается 1, а затем два левых разряда заменяются на 11. Полученная таким образом запись является двоичной записью искомого числа R.
Укажите минимальное число N, после обработки которого с помощью этого алгоритма получается число R, большее 4000. В ответе запишите это число в десятичной системе счисления. for n in range(1, 1000):
s = bin(n)[2:]
if len(s) % 2 == 0:
s = s[:len(s)//2] + '111' + s[len(s)//2:]
else:
s = '11' + s[2:] + '1'
r = int(s, 2)
if r > 4000:
print(n)
break Комментарии к решению задачи: for n in range(1, 1000):
x = n
M = []
while x > 0:
M.append(x % 2)
x //= 2
M.reverse()
if len(M
Условие: № 5589 (Уровень: Средний) На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом. а) если количество разрядов в числе чётное, тогда в центр записи числа дописывается 111.
б) если количество разрядов в числе нечётное, тогда к этой записи справа дописывается 1, а затем два левых разряда заменяются на 11. Полученная таким образом запись является двоичной записью искомого числа R.
Укажите минимальное число N, после обработки которого с помощью этого алгоритма получается число R, большее 4000. В ответе запишите это число в десятичной системе счисления. for n in range(1, 1000):
s = bin(n)[2:]
if len(s) % 2 == 0:
s = s[:len(s)//2] + '111' + s[len(s)//2:]
else:
s = '11' + s[2:] + '1'
r = int(s, 2)
if r > 4000:
print(n)
break Комментарии к решению задачи: for n in range(1, 1000):
x = n
M = []
while x > 0:
M.append(x % 2)
x //= 2
M.reverse()
if len(M
...Читать далее
Условие: № 5589 (Уровень: Средний)
На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом.
- Строится двоичная запись числа N.
- Далее эта запись обрабатывается по следующему правилу:
а) если количество разрядов в числе чётное, тогда в центр записи числа дописывается 111.
б) если количество разрядов в числе нечётное, тогда к этой записи справа дописывается 1, а затем два левых разряда заменяются на 11.
Полученная таким образом запись является двоичной записью искомого числа R.
Укажите минимальное число N, после обработки которого с помощью этого алгоритма получается число R, большее 4000. В ответе запишите это число в десятичной системе счисления.
for n in range(1, 1000):
s = bin(n)[2:]
if len(s) % 2 == 0:
s = s[:len(s)//2] + '111' + s[len(s)//2:]
else:
s = '11' + s[2:] + '1'
r = int(s, 2)
if r > 4000:
print(n)
break
Комментарии к решению задачи:
- for n in range(1, 1000): - Мы создаем цикл for, который перебирает все значения от 1 до 999 (не включая 1000), хранящиеся в переменной n (можно смело брать больший диапазон, никто не гарантирует, что результат найдется быстро).
- s = bin(n)[2:] - Присваиваем переменной s бинарное представление значения переменной n, которое мы получаем с помощью функции bin(). Мы также обрезаем первые два символа, так как они представляют префикс 0b, который используется в Python для обозначения бинарных чисел (числа двоичной системы счисления).
- if len(s) % 2 == 0: - Проверяем условие на чётное количество разрядов len(s) в числе с помощью оператора %.
- s = s[:len(s)//2] + '111' + s[len(s)//2:] - Если длина строки s четная, мы вставляем три символа 111 в середине строки s.
- else: - Если длина строки s нечетная, то
- s = '11' + s[2:] + '1' - Добавляем два символа 11 в начало и конец строки s.
- r = int(s, 2) - Преобразуем измененную строку s обратно в целое число, используя функцию int(). Второй аргумент этой функции - 2 - указывает, что строка s интерпретируется как бинарное число.
- if r > 4000: - Если значение r больше 4000, то
- print(n) - Мы выводим значение переменной n с помощью функции print().
- break - И выходим из цикла for с помощью оператора break. Если же мы не нашли значение n, для которого r было бы больше 4000, то имеет смысл увеличить диапазон for n in range(1, 1000) или проверить алгоритм на наличие ошибок.
Еще один вариант решения задачи, - через списки. Будем считать его более универсальным, так как сюда можно подставить любую систему счисления, не только 2-ную.
for n in range(1, 1000):
x = n
M = []
while x > 0:
M.append(x % 2)
x //= 2
M.reverse()
if len(M) % 2 == 0:
M = M[:len(M)//2] + [1, 1, 1] + M[len(M)//2:]
else:
M = [1, 1] + M[2:] + [1]
r = 0
M.reverse()
for i in range(0, len(M)):
r += M[i] * 2 ** i
if r > 4000:
print(n)
break
Комментарии к решению задачи:
- for n in range(1, 1000): - Мы создаем цикл for, который перебирает все значения от 1 до 999 (не включая 1000), хранящиеся в переменной n.
- x = n - Создаем переменную x, которой мы присваиваем значение переменной n (дабы сохранить значения переменной n).
- M = [] - Создаем пустой список M для хранения остатков от деления на 2
- while x > 0: - Используем цикл while, чтобы перевести значение переменной x в бинарное представление.
- M.append(x % 2) - Добавляем каждый остаток от деления на 2 в список M.
- x //= 2 - Делим значение переменной x на 2 и перезаписываем это значение в переменную x (иначе цикл получится бесконечным).
- M.reverse() - Обязательно разворачиваем список M, чтобы правильно сопоставить значениям по алгоритму.
- if len(M) % 2 == 0: - Проверяем, является ли длина списка M четной с помощью оператора %.
- M = M[:len(M)//2] + [1, 1, 1] + M[len(M)//2:] - Если это так, мы добавляем три символа 1 в середину списка M.
- else: - Если длина списка M нечетная, то
- M = [1, 1] + M[2:] + [1] - Мы добавляем два символа 1 в начало и конец списка M.
- r = 0 - Создаем переменную r, которой мы присваиваем значение 0 (сюда будем считать десятичную запись числа).
- M.reverse() - Разворачиваем список M, чтобы индексы списка сопоставились с порядковыми номерами из алгоритма перевода.
- for i in range(0, len(M)): - Используем цикл for, чтобы перебрать каждый элемент списка M.
- r += M[i] * 2 ** i - Мы добавляем к изначение, равное квадрату 2, возведенному в степень i, умноженное на значение элемента списка M на позиции i (четко действуем по алгоритму).
- if r > 4000: - Если значение r больше 4000, то
- print(n) - Мы выводим значение переменной n.
- break - Прерываем цикл, так как по условию нужно наименьшее число.
Ответ: 512
Присоединяйтесь и готовьтесь вместе с нами: https://t.me/+SIliQTddHE8xNTk6