Ruby中二项式系数(nCr)的算法

时间:2013-06-21 03:02:58

标签: ruby

我已经完成了解决这个问题的任务:

  

有五种方法从五种中选择三种,12345:

123, 124, 125, 134, 135, 145, 234, 235, 245, and 345
     

在组合学中,我们使用符号5C3 = 10。一般来说,

nCr = n! / r!(n−r)!
     

其中r ≤ nn! = n×(n−1)×...×3×2×10! = 1

     

直到n = 23,价值超过一百万:23C10 = 1144066

     

nCr的{​​{1}}的值,不一定是多少,1 ≤ n ≤ 100,   超过一百万?

我必须在Ruby中提出一个算法来解决这个问题,但我似乎不明白它是如何完成的。

1 个答案:

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