项目欧拉#255

时间:2009-09-15 13:01:56

标签: python

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。

4 个答案:

答案 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 Type

  

“3.6.3 XRange类型

     

xrange类型是不可变的   通常用于的序列   循环。 xrange的优势   type是一个xrange对象   总是占用相同的内存,   无论它的大小如何   代表。没有一致的   性能优势。

     

XRange对象很少   行为:他们只支持索引,   迭代和len()函数。“

也许......优化你的地板和天花板功能? :P