python计数非负整数中的位数
我正在编写一个程序,用于计算非负整数的位数,该整数的上限为10^{1000000},时间限制为12秒 我声明了一个大小为1000000的数组,索引0,1,2…,1000000对应于由10^{array index}表示的数字的位数。 但是,对于接近10^{10000}的输入范围,我的时间限制被超过。 请查找相同的内联代码:python计数非负整数中的位数,python,Python,我正在编写一个程序,用于计算非负整数的位数,该整数的上限为10^{1000000},时间限制为12秒 我声明了一个大小为1000000的数组,索引0,1,2…,1000000对应于由10^{array index}表示的数字的位数。 但是,对于接近10^{10000}的输入范围,我的时间限制被超过。 请查找相同的内联代码: def Number(x): a=[0]*(1000000) for j in xrange(len(a)): #print j
def Number(x):
a=[0]*(1000000)
for j in xrange(len(a)):
#print j
a[j]=j+1
i=0
flag=0
flagc=0
counter=0
while(i<len(a)-1):
#print x
if (10**i)==x:
print a[i]
flag=1
break
elif x>(10**i) and x<(10**(i+1)):
print a[i]
flag=1
break
i=i+1
if (i==len(a)-1 and flag==0 and x==(10**i)):
print a[i]
number=int(input())
Number(number+1)
def编号(x):
a=[0]*(1000000)
对于x范围内的j(len(a)):
#打印j
a[j]=j+1
i=0
标志=0
flagc=0
计数器=0
while(i(10**i)和x在纯python中实现这一点的最简单方法是使用len(number)
,其中“number”具有所需的基数。如上面的注释所示,math.log10
对于大的数字来说不够精确。请尝试while
循环:
n = 10 ** 10000 - 1
count = 0
while n > 0:
n //= 10
count += 1
print(count)
输出:
10000
将n
更改为10**10000
会按预期输出10001
编辑:我发现了一些非常令人惊讶的事情(至少对我来说):
实际上速度非常快!我测试了10^1000000的数字,它在几秒钟内完成执行!对评论说这是一个整数,在这个问题中讨论的数据将溢出一个整数,并且这些数字必须在内存中表示为字符串,因为它们的长度。OP在一篇评论中指出,他的问题是他需要以字符串的形式进行数字输入,加1,然后返回位数
当且仅当字符串完全由9
s组成时,数字加1将改变位数。一个简单的测试可以实现这一点。如果全部为9
s,则输出字符串长度加1,否则输出不变的字符串长度
num = input()
length = len(num)
if num == '9' * length: # checks if string is all 9's
print(length + 1)
else:
print(length)
通过消除转换为int
和返回的需要,我们节省了大量的时间。此代码在几秒钟内执行。为什么不简单地len(str(x))
?int(math.log10(n))+1
为什么不len(input())
?您的输入已经是字符串了,输入
函数就是这样返回它的。您的主代码需要时间将其转换为int
@d_kennetz进行数学运算。log10它一直工作到有15位数字为止。我尝试过这个方法,但当我将n的值更改为10**100000时,我得到了超出时间限制的值。我只是尝试了6位零s(您的程序要求),在大约8分钟内完成正确的结果。实际上,问题的时间限制为12秒。您至少应该在问题中指定这一点。让我们看看我能找到什么…@SumeettenDoeschate查看我编辑的答案,显然是“慢”方法并没有那么糟糕!在Python 3中,int
s是不受大小限制的。感谢您的帮助,提交成功通过
num = input()
length = len(num)
if num == '9' * length: # checks if string is all 9's
print(length + 1)
else:
print(length)