Подсчёт количества едениц в строке

Сколько единиц содержится в двоичной записи значения выражения: 4^255 + 2^255 − 255?

a = list(bin(4**255+ 2**255 - 255))
k = 0
for i in range(len(a)):
    if a[i] == 1:
        k += 1
print (k)

Что не так? И пожалуйста объясните.


Ответы (2 шт):

Автор решения: Владислав Харламов

Способ 1.

str(4**255 + 2**255 - 255).count('1')

Приводим к строке, вызываем строковый метод подсчета символа.

Способ 2.

sum(1 for elem in bin(4**255+ 2**255 - 255)) if elem == '1')

Считаем количество единиц, так как функция bin переводит к строковому типу вида '0bxxx', где xxx - цифры числа в двоичном представлении.

Способ 3.

Также существует несложный алгоритм.

4^255 = 2^(255 * 2) степень двойки, будет обозначать единица в двоичном представлении данной суммы.

2^255 -- аналогично.

С вычитанием интереснее, можно проследить следующую закономерность:

2^n - 2^m -- будет содержать n - m единиц (проверьте это и докажите самостоятельно).

Отсюда сделаем следующий финт: -255 = -256 + 1 = -2^8 + 2^0

В итоге наше выражение: 2^(255 * 2) + 2^255 - 2^8 + 1 будет иметь 1 + (255 - 8) + 1 единицу, так как 2^255 - 2^8 четное число и значит нулевой бит у него будет нулевой и прибавление единицы добавит только единицу.

→ Ссылка
Автор решения: руслан
a = ((8**1341)-(4**1342)+(2**1343)-1344)
result = bin(a).count ('1')
print (result)

у меня другое выражение но способ этот тоже работает вроде бы

→ Ссылка