Ruby中的二项系数(nCr)算法
我的任务是解决这个问题: 从五个12345中选择三个的方法有十种:Ruby中的二项系数(nCr)算法,ruby,Ruby,我的任务是解决这个问题: 从五个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 对于1,nCr的值有多少(不一定不同)≤ N≤ 100,, 超过一百万 我必须用Ruby提出一个算法
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
对于1,nCr
的值有多少(不一定不同)≤ N≤ 100
,,
超过一百万
我必须用Ruby提出一个算法来解决这个问题,但我似乎不明白它是如何实现的。这是一个project Euler问题。你需要应用帕斯卡三角形来解决这个问题。 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
它必须是一个“聪明”的算法吗?如果不是,您总是可以对所有这些问题进行求解,并计算产生的大于一百万的解决方案的数量。不清楚您所说的
是什么意思,直到n=23,值才超过一百万:23C10=1144066。
。10
来自哪里?你是说对某些人来说是?如果是这样,你需要写出来。@sawa实际上,它的副本是从实际问题页面粘贴的:@OscarSwanros那又怎样?你是把这个问题的不清楚归咎于原著的作者吗?那里的作者对那页上的内容负责。当你在这里引用它的时候,无论它有什么问题都是你的责任。