我已经完成了解决这个问题的任务:
有五种方法从五种中选择三种,12345:
123, 124, 125, 134, 135, 145, 234, 235, 245, and 345
在组合学中,我们使用符号
5C3 = 10
。一般来说,nCr = n! / r!(n−r)!
其中
r ≤ n
,n! = n×(n−1)×...×3×2×1
和0! = 1
。直到
n = 23
,价值超过一百万:23C10 = 1144066
。
nCr
的{{1}}的值,不一定是多少,1 ≤ n ≤ 100
, 超过一百万?
我必须在Ruby中提出一个算法来解决这个问题,但我似乎不明白它是如何完成的。
答案 0 :(得分:2)
这是一个项目欧拉问题。您需要应用pascal三角形来解决此问题。 pascal三角形是对称的,所以我们只需计算其中的一半来得到结果,这将使您的程序运行得更快。
另一种方法可以缓存先前计算的因子结果并使用它们以避免不必要的计算过载。
@@fact_table = []
@@fact_table[0] = 1;
@@fact_table[1] = 1;
for i in (2..100)
@@fact_table[i] = i * @@fact_table[i-1]
end
def ncr(n, r)
return @@fact_table[n] / (@@fact_table[r] * @@fact_table[n-r])
end
num = 0
for n in (1..100)
for r in (1..n)
if ncr(n, r) > 1000000
num += 1
end
end
end
print "Count exceeding 1 million: ", num, "\n"
<强>输出强>
Count exceeding 1 million: 4075