我目前正在尝试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
答案 0 :(得分:5)
要在Python中使用2**1000
计算2 ^ 1000。使用math.log
和math.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)))