您好,
我知道您可以使用以下公式(不考虑重复且顺序不重要)获取组合数:
//从n个物品中选r个
n! / r!(n - r)!
但是,我不知道如何在C++中实现它,因为例如:
n = 52
n! = 8,0658175170943878571660636856404e+67
即使对于 unsigned __int64
或 unsigned long long
类型的变量而言,这个数字也太大了。请问有没有不需要第三方“bigint”库的解决方法?
您好,
我知道您可以使用以下公式(不考虑重复且顺序不重要)获取组合数:
//从n个物品中选r个
n! / r!(n - r)!
但是,我不知道如何在C++中实现它,因为例如:
n = 52
n! = 8,0658175170943878571660636856404e+67
即使对于 unsigned __int64
或 unsigned long long
类型的变量而言,这个数字也太大了。请问有没有不需要第三方“bigint”库的解决方法?
如果您想要100%确保在数字限制内最终结果不会发生溢出,您可以逐行求和帕斯卡三角形:
for (int i=0; i<n; i++) {
for (int j=0; j<=i; j++) {
if (j == 0) current_row[j] = 1;
else current_row[j] = prev_row[j] + prev_row[j-1];
}
prev_row = current_row; // assume they are vectors
}
// result is now in current_row[r-1]
然而,这个算法比乘法慢得多。因此,也许你可以使用乘法来生成所有你知道的“安全”的情况,然后从那里开始使用加法。(或者你可以直接使用一个BigInt库)。
n--
可能会导致溢出。但这里不会发生。 - int3