大 n 表示阶乘
large n for factorials
我正在尝试解决一个非常简单的任务,即在 1<=n,k<=50 时找到 nCk。我似乎找不到一种方法来输出非常大的数字的结果,例如 50 in C++。我的算法仅适用于小整数值。
我为 nCk 公式实现了一个阶乘函数,但我找不到一种方法来解决更大的数字和 1s 中的此类任务。
#include <iostream>
using namespace std;
int main()
{
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
int i, n, k;
long long res, num, den;
res = num = den = 1;
cin >> n >> k;
if (n < k) {
cout << 0;
return 0;
}
if (n == k || k == 0) {
cout << 1;
return 0;
}
for (i = 1; i <= k; i++) {
if ((n - i + 1) % i == 0) {
res = res * ((n - i + 1) / i);
}
else {
num *= (n - i + 1);
den *= i;
}
}
cout << (res*num)/den;
return 0;
}
这个解决方案需要一些数学而不是编程(来解决溢出问题(。
你有:
n! / (k! * (n - k)!)
您可以通过扩展它轻松消除公共因素。例如:
n = 8, k = 3
8*7*6*5*4*3*2*1 / ((3*2*1) * (5*4*3*2*1))
扩展到
8*7*6*5*4*3*2*1 / 3*2*1*5*4*3*2*1
请注意我们如何通过除法规则从两者中删除5*4*3*2*1
?然后我们得到
8*7*6 / 3*2*1
这将更容易计算。
最终,如果你继续变大,你无论如何都会遇到问题,所以你可能需要研究Boost的多精度
您当前的公式是
binom(n, k) = n! / (n - k)!k!
这个公式对数学没问题,但对计算不行。 简化它:
binom(n, k) = n(n - 1)(n - 2) ... (n - k + 1) / k!
涉及的术语较少。 另请注意
binom(n, k) = binom(n, n - k)
如果k > n / 2
,可以用作优化。
此外,如果数字太大,则需要使用 GMP 等多精度库。
相关文章:
- 在 C++ 中的数组上使用阶乘函数
- 阶乘问题在 c++ 中给出错误的输出
- 大数的阶乘给出错误的输出
- 什么模板用法在阶乘中更好
- 为什么我在C++阶乘函数中出现编译错误?
- 计算阶乘的 C++17 倍表达式中的错误
- 为什么 Lisp 中 1000 阶乘的计算如此之快(并显示正确的结果)?
- 在C++中执行 N 阶乘编译时间的 3 种不同/相同方法
- 平方模型为零,阶乘模型问题
- 阶乘元规划
- 阶乘-c++ 我想以不同的方式打印
- 阶乘函数只返回C++中输入的答案
- 阶乘使用循环递增给出垃圾值
- 大 n 表示阶乘
- 为什么我不能在非常量表达式上使用此模板阶乘函数?
- 计算最大数字的阶乘
- 这个阶乘程序内部发生了什么?
- 返回阶乘C++的递归函数
- C++ 中是否有任何内置阶乘函数?
- 高效计算阶乘