这个问题比
答案所暗示的要微妙一些。
>>> num_digets(1000, 10)
3
>>> [num_digets(1000**i,10)%3 for i in range(1,10)]
[0, 0, 0, 0, 0, 0, 0, 0, 0]
def ndigits(N, b):
if b < 2:
raise ValueError('base must be integer greater than 1')
n = abs(N)
if n < b:
return 1
if b == 2:
return n.bit_length()
d = math.floor(math.log10(n)/math.log10(b))
b_ = b**d
while b_ <= n:
d += 1
b_ *= b
return d
>>> [ndigits(1000**i,10)%3 for i in range(1,10)]
[1, 1, 1, 1, 1, 1, 1, 1, 1]
这需要额外的注意,原因是
math.log(1000**i)/math.log(10)
比预期的浮点整数稍微小一些。
import math
>>> math.log(1000)/math.log(10)
2.9999999999999996
如果您在以10为底的情况下使用
math.log10
,它将按预期工作,但对于其他进制(如以5为底的125)将失败。这里是一组测试,无论您使用哪个公式:
assert ndigits(2, 2) == 2
assert ndigits(2**48 - 1, 2) == 48
assert ndigits(1000, 10) == 4
assert ndigits(125, 5) == 4
assert ndigits(100, 16) == 2
SymPy有一个名为
integer_log
的函数,可以用来计算精确值,因此答案是
1 + integer_log(n, b)[0]
。这并不复杂,但比直接使用
math.log
进行计算要慢一些。
source_base
是十进制,糟糕,我现在编辑... - ForceBru