Как найти число единиц в числе python

How do you count the number of ones in a given integer’s binary representation.

Say you are given a number 20, which is 10100 in binary, so number of ones is 2.

jamylak's user avatar

jamylak

128k30 gold badges230 silver badges230 bronze badges

asked Mar 21, 2013 at 6:24

Neil's user avatar

What you’re looking for is called the Hamming weight, and there are a lot of algorithms to do it. Here’s another straightforward one:

def ones(n):
    w = 0
    while (n):
        w += 1
        n &= n - 1
    return w

answered Mar 21, 2013 at 6:31

Cairnarvon's user avatar

CairnarvonCairnarvon

25.5k9 gold badges51 silver badges65 bronze badges

1

Use the awesome collections module.

>>> from collections import Counter
>>> binary = bin(20)[2:]
>>> Counter(binary)
Counter({'0': 3, '1': 2})

Or you can use the built-in function count():

>>> binary = bin(20)[2:]
>>> binary.count('1')
2

Or even:

>>> sum(1 for i in bin(20)[2:] if i == '1')
2

But that last solution is slower than using count()

answered Mar 21, 2013 at 6:27

TerryA's user avatar

TerryATerryA

58.6k11 gold badges114 silver badges142 bronze badges

9

>>> num = 20
>>> bin(num)[2:].count('1')
2

answered Mar 21, 2013 at 6:28

Yarkee's user avatar

YarkeeYarkee

8,8965 gold badges28 silver badges29 bronze badges

1

The usual way to make this blinding fast is to use lookup tables:

table = [bin(i)[2:].count('1') for i in range(256)]

def pop_count(n):
   cnt = 0
   while n > 0:
     cnt += table[n & 255]
     n >>= 8
   return cnt

In Python, any solution using bin and list.count will be faster, but this is nice if you want to write it in assembler.

vvvvv's user avatar

vvvvv

23.8k19 gold badges47 silver badges75 bronze badges

answered Mar 21, 2013 at 6:37

Torsten Marek's user avatar

Torsten MarekTorsten Marek

83k21 gold badges91 silver badges98 bronze badges

2

The int type has a new method int.bit_count() since python 3.10a, returning the number of ones in the binary expansion of a given integer, also known as the population count as follows:

n = 20
bin(n)
'0b10100'

n.bit_count() returns 2 as it has 2 ones in the binary representation.

answered Sep 19, 2020 at 19:04

Hamza's user avatar

HamzaHamza

5,2353 gold badges27 silver badges42 bronze badges

The str.count method and bin function make short work of this little challenge:

>>> def ones(x):
        "Count the number of ones in an integer's binary representation"
        return bin(x).count('1')

>>> ones(20)
2

answered Mar 21, 2013 at 6:29

Raymond Hettinger's user avatar

Raymond HettingerRaymond Hettinger

214k62 gold badges378 silver badges481 bronze badges

You can do this using bit shifting >> and bitwise and & to inspect the least significant bit, like this:

def count_ones(x):
    result = 0
    while x > 0:
        result += x & 1
        x = x >> 1
    return result

This works by shifting the bits right until the value becomes zero, counting the number of times the least significant bit is 1 along the way.

answered Jan 29, 2020 at 16:00

Brian Pursley's user avatar

I am a new coder and I found this one logic simple. Might be easier for newbies to understand.

def onesInDecimal(n):
  count = 0
  while(n!=0):
    if (n%2!=0):
        count = count+1
        n = n-1
        n = n/2
    else:
        n = n/2
  return count

answered Jun 24, 2017 at 13:22

Vivek Karn's user avatar

For a special case when you need to check quickly whether the binary form of the integer x has only a single 1 (and thus is a power of 2), you can use this check:

if x == -(x | (-x)):
    ...

The expression -(x | (-x)) is the number that you get if you replace all 1s except the last one (the least significant bit) in the binary representation of x with 0.

Example:

12 = 1100 in binary

-12 = …110100 in binary (with an infinite number of leading 1s)

12 | (-12) = …111100 in binary (with an infinite number of leading 1s)

-(12 | (-12)) = 100 in binary

answered Dec 27, 2021 at 23:35

Andrey Shutovich's user avatar

1

If the input number is ‘number’

number =20
len(bin(number)[2:].replace('0',''))

Another solution is

from collections import Counter

Counter(list(bin(number))[2:])['1']

1

As shown by other answers, using log10 leads to incorrect results for large n while using len(str(...)) or manual looping leads to slow performance for large n. Jodag’s answer provides a really good alternative which only fails for integers that will likely crash your computer, but we can do a bit better and even faster (for n small enough that math.log2 is guaranteed to be accurate) by avoid logarithms altogether and using binary instead:

def num_digits(n: int) -> int:
    assert n > 0
    i = int(0.30102999566398114 * (n.bit_length() - 1)) + 1
    return (10 ** i <= n) + i

Let’s break this down. First, there’s the weird n.bit_length(). This calculates the length in binary:

assert 4 == (0b1111).bit_length()
assert 8 == (0b1011_1000).bit_length()
assert 9 == (0b1_1011_1000).bit_length()

Unlike logarithms, this is both fast and precise for integers. As it turns out, this results in exactly floor(log2(n)) + 1. In order to get the floor(log2(n)) on its own, we subtract 1, hence the n.bit_length() - 1.

Next, we multiply by 0.30102999566398114. This is equivalent to log10(2) slightly rounded down. This takes advantage of logarithmic rules in order to calculate an estimate of floor(log10(n)) from floor(log2(n)).

Now, you might be wondering how off we might be at this point, because although 0.30102999566398114 * log2(n) ~ log10(n), the same is not true for floor(0.30102999566398114 * floor(log2(n))) ~ floor(log10(n)). Recall that x - 1 < floor(x) <= x so that we can do some quick math:

log2(n) - 1 < floor(log2(n)) <= log2(n)

log10(n) - 0.30102999566398114 < 0.30102999566398114 * floor(log2(n)) <= log10(n)

floor(log10(n) - 0.30102999566398114) < floor(0.30102999566398114 * floor(log2(n))) <= floor(log10(n))

Note then that floor(log10(n) - 0.30102999566398114) is at least floor(log10(n)) - 1, meaning we are at most 1 off from our result. This is where the final correction comes in, where we check 10 ** i <= n, which results in an extra 1 + when the result is too small or 0 + when the result is just right.

Similar to Jodag’s answer, this approach actually fails for very very large n, somewhere around 10 ** 2 ** 52 where i is off by more than -1. However, integers of that size will likely crash your computer, so this should suffice.

При помощи операции нахождения остатка и целочисленного деления можно достаточно несложно вычислить любую цифру числа.

Рассмотрим программу получения цифр двузначного числа:

num = 17
a = num % 10
b = num // 10
print(a)
print(b)

Результатом выполнения программы будут два числа:

7
1

То есть сначала мы вывели последнюю цифру числа, а затем первую цифру.

Запомни: последняя цифра числа определяется всегда как остаток от деления числа на 10 (% 10). Чтобы отщепить последнюю цифру от числа, необходимо разделить его нацело на 10 (// 10).

Рассмотрим программу получения цифр трёхзначного числа:

num = 754
a = num % 10
b = (num % 100) // 10
c = num // 100
print(a)
print(b)
print(c)

Результатом выполнения программы будут три числа:

4
5
7

То есть сначала мы вывели последнюю цифру числа, затем среднюю цифру, а затем первую цифру.

Алгоритм получения цифр n-значного числа

Несложно понять, по какому алгоритму можно найти каждую цифру n-значного числа num:

  • Последняя цифра: (num % 101) // 100;
  • Предпоследняя цифра: (num % 102) // 101;
  • Предпредпоследняя цифра: (num % 103) // 102;
  • …..
  • Вторая цифра: (num % 10n-1) // 10n-2;
  • Первая цифра: (num % 10n) // 10n-1.

Решение задач

Задача 1. Напишите программу, определяющую число десятков и единиц в двузначном числе.

Решение. Число единиц – это последняя цифра числа, число десятков – первая цифра. Чтобы получить последнюю цифру любого числа, нужно найти остаток от деления числа на 10. Чтобы найти первую цифру двузначного числа, нужно поделить число нацело на 10. Программа, решающая поставленную задачу, может иметь следующий вид:

num = int(input())
last_digit = num % 10
first_digit = num // 10
print('Число десятков =', first_digit)
print('Число единиц =', last_digit)

Задача 2. Напишите программу, в которой рассчитывается сумма цифр двузначного числа.

Решение. Программа, решающая поставленную задачу, может иметь следующий вид:

num = int(input())
last_digit = num % 10
first_digit = num // 10
print('Сумма цифр =', last_digit + first_digit)

Задача 3. Напишите программу, которая печатает число, образованное при перестановке цифр двузначного числа.

Решение. Программа, решающая поставленную задачу, может иметь следующий вид:

num = int(input())
last_digit = num % 10
first_digit = num // 10
print('Искомое число =', last_digit * 10 + first_digit)

Задача 4. Напишите программу, в которую вводится трёхзначное число и которая выводит на экран его цифры (через запятую).

Решение. Программа, решающая поставленную задачу, может иметь следующий вид:

num = int(input())
digit3 = num % 10
digit2 = (num // 10) % 10
digit1 = num // 100
print(digit1, digit2, digit3, sep=',')

На чтение 3 мин Просмотров 730 Опубликовано 02.03.2023

Содержание

  1. Введение
  2. Длинный способ с циклом while
  3. Короткий способ циклом for
  4. Самый быстрый способ
  5. Заключение

Введение

В ходе статьи рассмотрим три вариации кода для определения количества разрядов в ведённом пользователем числе на языке программирования Python.

Длинный способ с циклом while

Дадим пользователю возможность ввести число:

n = int(input('Введите число: '))

Если было введено отрицательное число, нужно его сделать положительным. Для этого добавим его в модуль методом abs():

n = int(input('Введите число: '))
n = abs(n)

Добавим переменную count равную нулю:

n = int(input('Введите число: '))
n = abs(n)

count = 0

Создадим цикл while, который не закончится, пока n > 0. В цикле будем убирать последнюю цифру в переменной n, а к count прибавлять единицу:

n = int(input('Введите число: '))
n = abs(n)

count = 0

while n > 0:
    n //= 10
    count += 1

Осталось вывести результат:

n = int(input('Введите число: '))
n = abs(n)

count = 0

while n > 0:
    n //= 10
    count += 1

print(count)

# Введите число: 164832
# 6

Короткий способ циклом for

Обычно подобным не занимаются при помощи цикла for, но почему бы и нет. Как и в предыдущем способе даём пользователю возможность ввода числа, и добавляем его в модуль. Также создаём переменную count равную нулю:

n = abs(int(input('Введите число: ')))
count = 0

Создадим цикл for, в котором пройдёмся по количеству символов в переменной n. Внутри цикла прибавляем к count единицу:

n = abs(int(input('Введите число: ')))
count = 0

for i in range(len(str(n))):
    count += 1

Выведем результат в консоль:

n = abs(int(input('Введите число: ')))
count = 0

for i in range(len(str(n))):
    count += 1

print(count)

# Введите число: 111
# 3

Самый быстрый способ

Как и в предыдущих способах даём пользователю возможность ввода числа, и добавляем его в модуль:

n = abs(int(input('Введите число: ')))

Теперь в переменную count сохраним длину значения преобразованного в строковый тип данных в переменной n:

n = abs(int(input('Введите число: ')))
count = len(str(n))

Выведем результат:

n = abs(int(input('Введите число: ')))
count = len(str(n))

print(f'В числе {n} находится {count} разрядов.')

# Введите число: 17424312
# В числе 17424312 находится 8 разрядов.

Заключение

В ходе статьи мы с Вами разобрали целых 3 способа определить количество разрядов в числе в Python. Надеюсь Вам понравилась статья, желаю удачи и успехов! 🙂

Admin

Вопрос:

Как вы рассчитываете количество единиц в заданном двоичном представлении целого числа.

Скажем, вам присвоено число 20, которое 10100 в двоичном формате, поэтому число единиц равно 2.

Лучший ответ:

Используйте awesome collections модуль.

>>> from collections import Counter
>>> binary = bin(20)[2:]
>>> Counter(binary)
Counter({'0': 3, '1': 2})

Или вы можете использовать встроенную функцию count():

>>> binary = bin(20)[2:]
>>> binary.count('1')
2

Или даже:

>>> sum(1 for i in bin(20)[2:] if i == '1')
2

Но последнее решение медленнее, чем при использовании count()

Ответ №1

То, что вы ищете, называется весом Хэмминга, и для этого существует множество алгоритмов. Вот еще один простой:

def ones(n):
w = 0
while (n):
w += 1
n &= n - 1
return w

Ответ №2

>>> num = 20
>>> bin(num)[2:].count('1')
2

Ответ №3

Обычный способ быстро сделать это ослепительно – использовать таблицы поиска:

table = [bin(i)[2:].count('1') for i in range(256)]

def pop_count(n):
cnt = 0
while n > 0:
cnt += table[n & 256]
n >>= 8
return cnt

В Python любое решение с использованием bin и list.count будет быстрее, но это хорошо, если вы хотите записать его на ассемблере.

Ответ №4

str.count и bin функция делает короткую работу этой небольшой задачей:

>>> def ones(x):
"Count the number of ones in an integer binary representation"
return bin(x).count('1')

>>> ones(20)
2

Ответ №5

Если номер входа – ‘номер’

number =20
len(bin(number)[2:].replace('0',''))

Другим решением является

from collections import Counter

Counter(list(bin(number))[2:])['1']

Ответ №6

Я новый кодер, и я нашел эту логику простой. Возможно, легче понять новичков.

def onesInDecimal(n):
count = 0
while(n!=0):
if (n%2!=0):
count = count+1
n = n-1
n = n/2
else:
n = n/2
return count

Добавить комментарий