Длина целого числа в Python

Istr (133) Pytholen (str (123)), как вы находите число цифр в импортированных математических таблицах = int (math.log10 (n)) + 1 eger?

python,count,integer,

153

Ответов: 14


187 голосов принято

Если вы хотите математику импорта, если n> 0: digits = int (math.log10 (n)) + 1 elif n == 0: digits = 1 else: digits = int (math.log10 (-n)) + 2 # +1, если вы не считаете '-' gth len (str ()) eger, как в количестве цифр целого числа, вы всегда можете преобразовать его в строку, как timeit math.log10(2**8) 1000000 loops, best of 3: 746 ns per loop timeit len(str(2**8)) 1000000 loops, best of 3: 1.1 Aµs per loop timeit math.log10(2**100) 1000000 loops, best of 3: 775 ns per loop timeit len(str(2**100)) 100000 loops, best of 3: 3.2 Aµs per loop timeit math.log10(2**10000) 1000000 loops, best of 3: 844 ns per loop timeit len(str(2**10000)) 100 loops, best of 3: 10.3 ms per loop и найти ее длину def getIntegerPlaces(theNumber): if theNumber <= 999999999999997: return int(math.log10(theNumber)) + 1 else: counter = 15 while theNumber >= 10**counter: counter += 1 return counter .


Без преобразования в строку

2.*

Для обработки нулевого и отрицательного чисел

int

Вероятно, вы захотите добавить это в функцию :)

Вот некоторые ориентиры. Это sys.maxintуже отстает даже на довольно небольшие цифры

2**31-1

22

Все решения 2 ** 63-1 дадут вам проблемы.

math.log10 работает быстро, но дает проблемы, когда ваш номер больше 999999999999997. Это связано с тем, что у float слишком много .9s, в результате чего результат округляется.

Решение состоит в том, чтобы использовать метод счетчика в то время для чисел выше этого порога.

Чтобы сделать это еще быстрее, создайте 10 ^ 16, 10 ^ 17 так далее и сохраните в качестве переменных в списке. Таким образом, это похоже на поиск в таблице.

int

21

Python long ints занимает 4 или 8 байт (32 или 64 бит), в зависимости от вашей сборки Python. sys.getsizeof( >>> import sys >>> sys.getsizeof(0) 12 >>> sys.getsizeof(2**99) 28 для 32-битных ints, lenдля 64-битных ints) расскажет вам, какая из двух возможностей получает.

В Python 3 ints (например, ns в Python 2) может принимать произвольные размеры до объема доступной памяти; nдает хорошее представление для любого заданного значения, хотя это также рассчитывать некоторые фиксированные накладные расходы:

math.floor(math.log10(n))+1

Если, как следует из других ответов, вы думаете о каком-то строчном представлении целочисленного значения, тогда просто возьмите lenэто представление, будь то в базе 10 или иначе!


Пусть число будет nтогда числом цифр в n:

math.log10

Обратите внимание, что это даст правильные ответы для целых чисел + ve <10e15. Кроме того, пределы точности возвращаемого типа math.log10пинов и ответа могут быть отключены на 1. Я бы просто использовал len(str(n))это; для этого требуется O(log(n))время, такое же, как итерация по степеням 10.

Спасибо @SetiVolkylany за то, что привлек мое внимание к этому ограничению. Удивительно, как, казалось бы, правильные решения имеют оговорки в деталях реализации.

Python, граф, целое число,
Похожие вопросы