python中的项目euler(#53)

时间:2010-07-29 09:00:11

标签: python

所以我正在学习python,所以我正在经历一些项目的euler问题。而且我不确定这是否是我遇到的python问题,或者只是我被阻止了,但我似乎得到了问题53的错误答案。这里是问题的链接http://projecteuler.net/index.php?section=problems&id=53

这是我的代码:


from math import factorial

def ncr(n,r):
    return (factorial(n)/(factorial(r)*factorial(n-r)))

i = 0

for x in range(1,100):
    for y in range(0,x):
        if(ncr(x,y) > 1000000):
            i=i+1

print i

我得到3982这显然是错误的答案。我正在做的那些特定于python的错误吗?

5 个答案:

答案 0 :(得分:10)

range( a, b)不包括b

答案 1 :(得分:4)

我认为你的代码是正确的,但是,你应该将x迭代到100,所以你应该使用

for x in range(1,101):

希望有所帮助。欧拉摇滚!

答案 2 :(得分:3)

请注意,n大于或等于1 AND 小于或等于100.目前您的n从1到99.您也可以使用xrange

from math import factorial

def ncr(n,r):
    return (factorial(n)/(factorial(r)*factorial(n-r)))

i = 0

for x in range(1,101):
    for y in range(1,x+1):
        if(ncr(x,y) > 1000000):
            i=i+1

print i

答案 3 :(得分:2)

如果您是初学者,我会利用这个机会,考虑项目Euler的性质,给出编码替代方案,这是自包含的,并演示查找表方法以加速递归函数并保存字典的答案并使用len作为计数。

希望4075是正确答案!

from __future__ import division
factorials={}

def factorial(n):
    """ factorial from lookup table ready or generate it to there """
    if n not in factorials:
        factorials[n]=1 if  n==0 else n*factorial(n-1)
    return factorials[n] 

def ncr(n,r):
    return (factorial(n)/(factorial(r)*factorial(n-r)))

bigones= [(x,y) for x in range(1,1+100) for y in range(x) if ncr(x,y) > 1000000 ]

print len(bigones)

答案 4 :(得分:0)

考虑problem specification的输入:    “直到n = 23,这个值超过一百万”, 你可以把外面的范围从23到101:

for x in range(23,101):
  ...

此外,可以更快地计算n over k而不生成三个阶乘:

def noverk(n,k):
  noverk=1
  if 2*k < n:
    k=n-k;
  for i in range(1,n-k+1):
    noverk *= (i+k)
    noverk /= i
  return noverk;