python计数非负整数中的位数

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

我正在编写一个程序,用于计算非负整数的位数,该整数的上限为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
        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)