python - 在python中,整数的长度

在Python中,如何找到整数中的位数?

时间:

如果要将整数的长度与整数中的位数相同,则可以将它转换为像str(133)这样的字符串, 并找到它的长度,如len(str(123))。

不转换到字符串


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

如果数字是n,那么n中的位数是:


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

请注意,这将只为整数提供正确的答案。


from math import log10
digits = lambda n: ((n==0) and 1) or int(log10(abs(n)))+1

对于后人来说,毫无疑问,这个问题迄今为止最慢的解决方案,


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)

所有math.log10解决方案都会给你带来问题,

如果你的数字大于999999999999997,math.log10会很快出现问题,这是因为float有太多的.9s,导致结果聚集起来。

解决方案是对高于该阈值的数字使用while计数器方法。

要使这个更快,创建10^16,10^17等等,在列表中存储变量,这样,就像一个表查找。


def getIntegerPlaces(theNumber):
 if theNumber <= 999999999999997:
 return int(math.log10(theNumber)) + 1
 else:
 counter = 15
 while theNumber >= 10**counter:
 counter += 1
 return counter


def length(i):
 return len(str(i))

对于刚刚提到的@gnibbler的一点修正,一切都很好,但是,我认为他提到了(+2 ),它不能工作,你可能必须使用+1


import math

def gui():
 n=int(input("Enter any number"))
 if n>0:
 print(int(math.log10(n))+1)
 elif n==0:
 print(1)
 else:
 print(int(math.log10(-n))+1)**

...