Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 阶乘的大n_C++ - Fatal编程技术网

C++ 阶乘的大n

C++ 阶乘的大n,c++,C++,我正在尝试解决一个非常简单的任务,即在1时查找nCk。这个解决方案需要一些数学知识,而不是编程来解决溢出问题 你有: 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 这将更

我正在尝试解决一个非常简单的任务,即在1时查找nCk。这个解决方案需要一些数学知识,而不是编程来解决溢出问题

你有:

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
这将更容易计算


最终,如果你继续变大,你会遇到问题,所以你可能需要研究一下你当前的公式是什么

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。

这是一种非常古怪的编写std::ifstream ifs{input.txt}的方法;如果。。。不要在没有充分理由的情况下打开标准流。您需要以一种巧妙的方式使用数组/向量来保存每个数字,然后这样输出,或者在我看来,更好的方法是使用类似的方式,除非I/O是您的主要问题,否则您可能只需要提供一个主要调用factorial50,告诉我们真正的问题是什么。结果错了吗?它是什么,应该是什么?还是会崩溃?你试着调试它什么?你知道那是50!它太大了,无法长时间存储,因此您必须找到其他解决问题的方法。你不能这样做,在C++中。我投票赞成重新打开这个问题,因为它是关于二项式系数NCK而不是阶乘。这两者是相关的,但并不完全相同。好吧,你认为这在不诉诸GMP的情况下对n=50有效吗?@Papa binom50,25<2^47。不过,分子和分母都大于2^83。如果你在正确的时间进行划分,它就会起作用。如果你把所有的东西相乘,然后除以,就不会了。上面的算法好吗?或者我应该如何在正确的时间进行除法,因为有一个C6,4的例子,它是4/45/36/27/1,如果你能看到在I时间进行除法很难,有时分数是不可除的。@Papa是的,很难展开除法。我能想到的最好办法就是跟踪除数数组并尝试。。。当你删除一个除数时,交换一个后面的除数,使之成为O1。我用一个简单的技巧做了一个即时除法的更新。仍然不起作用。好的。你能提出一些建议吗。这个技巧并不全面,但启发性地说,它确实起到了一定的作用。程序描述还要求只使用循环而不使用数组。好的,你认为这在不使用Boost的情况下对n=50有效吗?@Papa为什么不检查阶乘序列列表?50! ≈ 3.041409320×10⁶⁴ 如果您的编译器支持max~3.40×10³,则远远超过最大uint64_t值,甚至超过无符号128位类型⁸@Papa取决于您选择的k值。@phuclv简单地说,我们的任务是使用循环求解,提供的唯一信息是1s约束和二项式公式。@Water通常为1
binom(n, k) = binom(n, n - k)