计算更大数字的位数

时间:2012-01-29 17:42:20

标签: python math

我目前正在尝试Project Euler,其中一个问题是计算2 ^ 1000,并计算位数。我可以很容易地做到2 ^ 15,但2 ^ 1000的问题是,当我计算它时,它是用科学记数法给出的,所以很难对数字求和。

import math

def power(x):
    y_p=1000*math.log(x,10.0)
    y=math.pow(10,y_p)
    return y

if __name__=="__main__":

    ans=power(2)
    a=str(ans)
    print a
    sum=0

    for i in a:
       if i == ".":
          print "encountered ."
       elif i == "e":
          break
       else:
          sum=sum+int(i)

    print sum

8 个答案:

答案 0 :(得分:5)

要在Python中使用2**1000计算2 ^ 1000。使用math.logmath.pow等浮点函数可能会得到不准确的结果。

现在,这是如何做到的:

l = str(2**1000)
digits = [int(digit) for digit in l]
print sum(digits)

第一行将数字转换为基数为10的字符串。第二行迭代字符并将字符串转换为数字列表。第三个打印出他们的总和。

答案 1 :(得分:2)

实际上更简单的方法是在python中使用log(或log10)。 log10具有足够的精度,甚至可以立即解决2 ** 1000000而无需占用任何空间。

from math import log10
ans=int(1000*log10(2))+1

答案 2 :(得分:1)

其他答案解决了如何对大数字进行求和的问题,但如果你的问题确实是关于如何获得数字的数字,那么就这样做

largenumber=2*1000
int(math.log(largenumber,10)+1)

len(str(largenumber))

答案 3 :(得分:0)

使用long()?

import math

def power(x):
    y_p = 1000 * math.log(x, 10.0)
    y = math.pow(10, y_p)
    return long(y)  # convert to long since we know it is an integral value

if __name__ == "__main__":
    ans = power(2)
    a = str(ans)
    print a
    print len(a)

答案 4 :(得分:0)

使用整数运算,python中的int不会溢出,因此无需进行浮点计算。自己计算能力:

def pow(a, b):
    n = 1
    for i in range(b):
        n *= a
    return a

是O(n)。您也可以尝试O(lg n)方法:

def pow(a, b):
    if b == 0:
        return 1
    temp = pow(a, b/2)
    if b % 2 == 0:
        return temp * temp
    return temp * temp * a

计算你现在正在做的数字之和。

答案 5 :(得分:0)

避免使用双精度并使用任意长度的整数:

  sum([ int(i) for i in str(2 ** 1000) ])

答案 6 :(得分:0)

要解决此问题,请使用整数数学并将结果转换为字符串:

>>> digits = str(2 ** 1000)
>>> len(digits)              # count the digits
302
>>> sum(map(int, digits))    # sum the digits
1366

答案 7 :(得分:0)

计算大整数位数的另一个选项是

MyApp.config.params_name = {:key_1 => "value"}

例如:

int(math.ceil(math.log10(big_integer)))