Project euler problem #255非常数学。我想出了如何为给定的例子做到这一点。由于我是Python的新手,我不知道如何处理远程值。以下是我的解决方案。但它如何适用于10 ^ 13和10 ^ 14?
def ceil(a, b):
return (a + b - 1) / b;
def func(a, b):
return (b + ceil(a, b)) / 2;
def calculate(a):
ctr = 1;
y = 200;
while 1:
z = func(a, y);
if z == y:
return ctr;
y = z;
ctr += 1;
result = sum(map(calculate, xrange(10000, 100000))) / 9e4;
print "%.10f" % result;
这给出了3.2102888889。
答案 0 :(得分:4)
请勿使用map
。它会在内存中生成一个大列表。
请勿使用xrange
。它仅限于短整数。
使用生成器。
# No changes on `ceil()`, `func()` and `calculate()`
def generate_sequence(start, stop):
while start < stop:
yield start
start += 1
result = sum(calculate(n) for n in generate_sequence(10**13, 10**14))
print "%.10f" % result;
那将会运行。但是总结10**14 - 10**13 = 90,000,000,000,000
结果需要很长时间。也许你还可以采取其他措施来优化(提示,提示)
答案 1 :(得分:1)
即使对每个数字进行非常快速的计算也需要很长时间。要满足1分钟规则,您需要每秒解决/增加1.5万亿次数。
我认为必须有一种方法可以更直接地计算结果。
答案 2 :(得分:0)
90,000,000,000,000是需要检查的大量数字,我尝试检查每百万个数字,并认为平均值足够接近,但无济于事。
答案 3 :(得分:0)
“3.6.3 XRange类型
xrange类型是不可变的 通常用于的序列 循环。 xrange的优势 type是一个xrange对象 总是占用相同的内存, 无论它的大小如何 代表。没有一致的 性能优势。
XRange对象很少 行为:他们只支持索引, 迭代和len()函数。“
也许......优化你的地板和天花板功能? :P