所以我正在学习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的错误吗?
答案 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;