【问题标题】:C - a simple expression for counting combinations in a range of numbers?C - 一个计算一系列数字组合的简单表达式?
【发布时间】:2013-02-09 09:51:55
【问题描述】:

嗯,真的是一个模糊的陈述(对我来说)

计算的基本表达式是什么:

  • “n个事物的组合数一次取k个整数”

编辑: 再澄清一点: “例如,a,b,c,d 四个项目的组合,一次取三个,分别是 abc、abd、acd 和 bcd。也就是说,总共有四个不同的四个事物组合”取三个在一次”。”

我正在参加非入门 C 课程,同时尝试完成我的数学要求以转学 CS 学位。到目前为止,我在所有工作中都获得了很高的分数,但是当更高级别的数学出现时,我真的被卡住了。但我离题了..

n 的数字范围是 1-10 k 的范围是 1-4。

以下是我收到的唯一参考资料,而且超出了我的想象。

http://www.themathpage.com/aPreCalc/permutations-combinations-2.htm

【问题讨论】:

  • 如果对您的问题提供清晰准确答案的页面超出了您的想象,那么我不确定我们能做些什么来帮助您。听起来你需要学习的数学比你所拥有的要多得多。我们不能在这里教你数学。
  • 您也可以查看Combination。您也可以在我们的姊妹网站Mathematics 上提问数学问题。
  • 长期在纸上做,一直弄乱它直到它变得清晰并且解决方案击中你或者你决定CS可能是错误的路径(以先到者为准)
  • 如果你想取得进步,你需要看看那个页面上的究竟是什么在你的脑海里 并开始解决这个问题。显然,首先是您需要帮助的页面,然后您可以继续使用 C 代码。 所以:你在页面的哪个位置卡住了?

标签: c math


【解决方案1】:

基本表达式是 n!/(k!(n-k)!)。一种有效的计算方法是使用帕斯卡三角形的 2D DP 表。

【讨论】:

  • 这个可以写成`n(factorial)/(k(factorial(n-k)factorial)
  • 感叹号表示阶乘运算。例如嗯! = n*(n-1)*(n-2)*...*1.
【解决方案2】:

页面上的关键表达式是:

  • nCk = n! ÷ ((n - k)!k!)

这是“一次kn个事物的组合数”的简单表达式。 nCk 一词是数学家写“所采取的 n 个事物的组合数 的方式k 一次”。右边的表达式是计算正确值的简洁、准确和简单的方法。它假定您知道 n! 是阶乘 n,而“阶乘 n”表示 1 和 n 相乘。

请注意,n! 很快就会变得非常大,因此朴素算法将工作到大约 n = 12,但远远超出此范围,您必须确实很小心。

  • 0! = 1
  • 1! = 1
  • 2! = 2
  • 3! = 6
  • 4! = 24
  • 5! = 120
  • 6! = 720
  • 7! = 5040
  • 8! = 40320
  • 9! = 362880
  • 10! = 3628800
  • 11! = 39916800
  • 12! = 479001600
  • 13! = 6227020800

请注意,13!太大而无法放入 32 位无符号整数,而 21!太大而无法放入 64 位无符号整数,而 35!太大而无法放入 128 位无符号整数(如果您能找到具有这种类型的计算机)。

如果您仍然无法应付,那么您将在转会中遇到问题;这不是很复杂的数学。

【讨论】:

  • 这可以写成 n(factorial) + ((n-k)factorial k factorial)
  • 这就是我需要写的“1和n之间的每个数字相乘”
  • 在 C 中你更可能将其写为 factorial(n) / (factorial(n-k) * factorial(k))
  • 在 C 中你更可能将其写为 factorial(n) / (factorial(n-k) * factorial(k))。你可以编写函数 unsigned factorial(unsigned n) { ... } 来进行计算,或者简单地创建一个包含值的数组并返回正确的元素数组(因为有效值的范围很小)。
  • 谢谢!这是我需要知道的。
猜你喜欢
  • 1970-01-01
  • 2020-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多