Задать вопрос
g1shy
@g1shy
Young python learner

Проблема с заменой элемента списка?

Даны условия задачи:

Алгоритм получает на вход натуральное число N > 1 и строит по нему новое число R следующим образом:
1. Строится двоичная запись числа N.
2. Вместо последней (самой правой) двоичной цифры дважды записывается вторая слева цифра двоичной записи.
3. Результат переводится в десятичную систему.
Пример. Дано число N = 19. Алгоритм работает следующим образом:
1. Двоичная запись числа N: 10011.
2. Вторая слева цифра 0, единица в конце записи заменяется на два нуля, новая запись 100100.
3. Результат работы алгоритма R = 36.

При каком наименьшем числе N в результате работы алгоритма получится R > 76? В ответе запишите это число в десятичной системе счисления.


Вот как я попытался её решить:

for n in range(1, 1000):
    r = [str(bin(n))]
    r[-1] = r[3] * 2
    while int(r, 2) > 76:
        n += 1
print(int(r, 2))


Pycharm ругается и выдаёт такие ошибки:

60524de1ddeac955924903.png

60524defa839f616461511.png

Буду очень признателен, если поможете
  • Вопрос задан
  • 611 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 2
SoreMix
@SoreMix Куратор тега Python
yellow
Ну,
  1. bin() и так возвращает строку, так что не нужно конвертировать строку в строку.
  2. bin() возвращает строку с префиксом "0b", так что его нужно обрезать.
  3. зачем добавлять результат bin() в список?.
  4. Элемента с индексом 3 нет, потому что элемент один - результат bin()
  5. Даже если не добавлять bin() в список, а работать сразу с ним - будет ошибка, т.к. элемент с индексом 3 появится только при условии n > 7
  6. while не нужен
  7. вторая слева цифра имеет индекс не 3, а 1
  8. элемент в строке нельзя заменить через индекс
  9. ответ не выводится, цикл не прерывается
  10. print() не имеет смысла
Ответ написан
adugin
@adugin Куратор тега Python
binary = bin(19)
int(binary[:-1] + binary[3] * 2, 2)  # 36

А ещё можно так (возможно, есть ошибка - проверьте):
N = 19
L = N.bit_length() - 2
(N >> 1 << 2) | 0b11 * ((N & 1 << L) >> L)  # 36
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы