Python中整数的长度
在Python中,你如何find一个整数中的位数?
如果你想要一个整数的长度,就像整数中的数字一样,你总是可以把它转换成像str(133)
这样的str(133)
并且像len(str(123))
那样find它的长度。
没有转换为string
import math digits = int(math.log10(n))+1
也处理零和负数
import math if n > 0: digits = int(math.log10(n))+1 elif n == 0: digits = 1 else: digits = int(math.log10(-n))+2 # +1 if you don't count the '-'
你可能想把它放在一个函数:)
这是一些基准。 len(str())
已经落后了,甚至是很小的数字
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 µ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 µ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
Python 2.*
int
s取4或8个字节(32或64位),具体取决于您的Python构build。 sys.maxint
(32位整数为2**31-1
sys.maxint
位整数为2**63-1
)将告诉你两种可能性中的哪一种可能。
在Python 3中, int
s(像Python 2中的long
s)可以采用任意大小的可用内存量; sys.getsizeof
给你一个很好的指示给任何给定的值,但它也计算一些固定的开销:
>>> import sys >>> sys.getsizeof(0) 12 >>> sys.getsizeof(2**99) 28
如果像其他答案所暗示的那样,你正在考虑整数值的一些string表示,那么就把这个expression式的len
取为10,否则!
所有的math.log10解决scheme都会给你带来问题。
math.log10是快速的,但是当你的数字大于999999999999997时会出现问题。这是因为浮点数太多了.9s,导致了结果的四舍五入。
解决scheme是使用一个时间计数器方法来处理高于该阈值的数字。
为了使这个更快,创build10 ^ 16,10 ^ 17等等,并作为variables存储在列表中。 这样,就像查表一样。
def getIntegerPlaces(theNumber): if theNumber <= 999999999999997: return int(math.log10(theNumber)) + 1 else: counter = 15 while theNumber >= 10**counter: counter += 1 return counter
设数字为n
则n
的位数由下式给出:
math.floor(math.log10(n))+1
请注意,这将为正整数<10e15给出正确的答案。 除此之外, math.log10
的返回types的精度限制也可以是1.我只是简单地使用len(str(n))
; 这需要O(log(n))
时间,它与迭代10次幂相同。
感谢@SetiVolkylany将我的注意力带到这个限制。 它惊人的如何看似正确的解决scheme有执行细节的警告。
那么,不转换为string我会做这样的事情:
def lenDigits(x): """ Assumes int(x) """ x = abs(x) if x < 10: return 1 return 1 + lenDigits(x / 10)
极简主义recursionFTW
对于后代来说,毫无疑问,这是解决这个问题最慢的方法:
def num_digits(num, number_of_calls=1): "Returns the number of digits of an integer num." if num == 0 or num == -1: return 1 if number_of_calls == 1 else 0 else: return 1 + num_digits(num/10, number_of_calls+1)
from math import log10 digits = lambda n: ((n==0) and 1) or int(log10(abs(n)))+1
正如前面提到的亲爱的用户@Calvintwr,函数math.log10
在范围[-999999999999997,9999999999999997]以外的数字中有问题,我们得到浮点错误。 我在JavaScript(Google V8和NodeJS)和C(GNU GCC编译器)中遇到了这个问题,所以这里'purely mathematically'
解决scheme是不可能的。
基于这个要点和亲爱的用户@Calvintwr的答案
import math def get_count_digits(number: int): """Return number of digits in a number.""" if number == 0: return 1 number = abs(number) if number <= 999999999999997: return math.floor(math.log10(number)) + 1 count = 0 while number: count += 1 number //= 10 return count
我用长达20(含)的数字对它进行了testing。 它必须是足够的,因为64位系统上的最大整数长度是19( len(str(sys.maxsize)) == 19
)。
assert get_count_digits(-99999999999999999999) == 20 assert get_count_digits(-10000000000000000000) == 20 assert get_count_digits(-9999999999999999999) == 19 assert get_count_digits(-1000000000000000000) == 19 assert get_count_digits(-999999999999999999) == 18 assert get_count_digits(-100000000000000000) == 18 assert get_count_digits(-99999999999999999) == 17 assert get_count_digits(-10000000000000000) == 17 assert get_count_digits(-9999999999999999) == 16 assert get_count_digits(-1000000000000000) == 16 assert get_count_digits(-999999999999999) == 15 assert get_count_digits(-100000000000000) == 15 assert get_count_digits(-99999999999999) == 14 assert get_count_digits(-10000000000000) == 14 assert get_count_digits(-9999999999999) == 13 assert get_count_digits(-1000000000000) == 13 assert get_count_digits(-999999999999) == 12 assert get_count_digits(-100000000000) == 12 assert get_count_digits(-99999999999) == 11 assert get_count_digits(-10000000000) == 11 assert get_count_digits(-9999999999) == 10 assert get_count_digits(-1000000000) == 10 assert get_count_digits(-999999999) == 9 assert get_count_digits(-100000000) == 9 assert get_count_digits(-99999999) == 8 assert get_count_digits(-10000000) == 8 assert get_count_digits(-9999999) == 7 assert get_count_digits(-1000000) == 7 assert get_count_digits(-999999) == 6 assert get_count_digits(-100000) == 6 assert get_count_digits(-99999) == 5 assert get_count_digits(-10000) == 5 assert get_count_digits(-9999) == 4 assert get_count_digits(-1000) == 4 assert get_count_digits(-999) == 3 assert get_count_digits(-100) == 3 assert get_count_digits(-99) == 2 assert get_count_digits(-10) == 2 assert get_count_digits(-9) == 1 assert get_count_digits(-1) == 1 assert get_count_digits(0) == 1 assert get_count_digits(1) == 1 assert get_count_digits(9) == 1 assert get_count_digits(10) == 2 assert get_count_digits(99) == 2 assert get_count_digits(100) == 3 assert get_count_digits(999) == 3 assert get_count_digits(1000) == 4 assert get_count_digits(9999) == 4 assert get_count_digits(10000) == 5 assert get_count_digits(99999) == 5 assert get_count_digits(100000) == 6 assert get_count_digits(999999) == 6 assert get_count_digits(1000000) == 7 assert get_count_digits(9999999) == 7 assert get_count_digits(10000000) == 8 assert get_count_digits(99999999) == 8 assert get_count_digits(100000000) == 9 assert get_count_digits(999999999) == 9 assert get_count_digits(1000000000) == 10 assert get_count_digits(9999999999) == 10 assert get_count_digits(10000000000) == 11 assert get_count_digits(99999999999) == 11 assert get_count_digits(100000000000) == 12 assert get_count_digits(999999999999) == 12 assert get_count_digits(1000000000000) == 13 assert get_count_digits(9999999999999) == 13 assert get_count_digits(10000000000000) == 14 assert get_count_digits(99999999999999) == 14 assert get_count_digits(100000000000000) == 15 assert get_count_digits(999999999999999) == 15 assert get_count_digits(1000000000000000) == 16 assert get_count_digits(9999999999999999) == 16 assert get_count_digits(10000000000000000) == 17 assert get_count_digits(99999999999999999) == 17 assert get_count_digits(100000000000000000) == 18 assert get_count_digits(999999999999999999) == 18 assert get_count_digits(1000000000000000000) == 19 assert get_count_digits(9999999999999999999) == 19 assert get_count_digits(10000000000000000000) == 20 assert get_count_digits(99999999999999999999) == 20
所有使用Python 3.5testing的代码示例
假设您要求可以存储在一个整数中的最大数字,则该值取决于实现。 我build议你在使用python的时候不要这么想。 在任何情况下,相当大的值可以存储在一个python的“整数”。 请记住,Python使用鸭子打字!
编辑:我澄清之前给出了我的答案,提问者想要的位数。 为此,我同意接受答案所build议的方法。 没有更多的补充!
def length(i): return len(str(i))
它可以快速完成使用:
len(str(abs(1234567890)))
其中获取“1234567890”的绝对值的string的长度
abs
返回没有任何负数的数字(只有数字的大小), str
将其转换/转换为一个string, len
返回该string的string长度。
如果你希望它为浮动工作,你可以使用下面的任何一个:
# Ignore all after decimal place len(str(abs(0.1234567890)).split(".")[0]) # Ignore just the decimal place len(str(abs(0.1234567890)))-1
备查。
>>> a=12345 >>> a.__str__().__len__() 5