如何解决我使用一些较大的大值时出现问题,我的函数输出错误
因此,我是stackoverflow和编码的新手,正在学习c ++中的函数以及栈框架的工作方式等。 我做了一个阶乘函数,并用它来计算二项式系数。对于n = 10和r = 5等较小的值,它的工作效果很好。但是对于23C12等中等值,它的结果为4。
我的代码:
#include <iostream>
using namespace std;
int fact(int n)
{
int a = 1;
for (int i = 1; i <= n; i++)
{
a *= i;
}
return a;
}
int main()
{
int n,r;
cin >> n >> r;
if (n >= r)
{
int coeff = fact(n) / (fact(n - r) * fact(r));
cout << coeff << endl;
}
else
{
cout << "please enter valid values. i.e n>=r." << endl;
}
return 0;
}
感谢您的帮助!
解决方法
您本质上没有做任何“错误”的事情。只是阶乘迅速变得庞大。
在您的示例中,您使用的是int
,它们通常是32位变量。如果看一下析因表,您会注意到log2(13!) = 32.535...
。因此,适用于32位数字的最大阶乘是12!
。对于64位变量,可以存储的最大阶乘为20!
(自log2(21!) = 65.469...
起)。
由于溢出而得到4
的结果。
如果您需要能够计算出如此庞大的数字,我建议使用一个GMP之类的bignum库。
,工厂容易溢出。实际上,您几乎不需要裸析因,但是它们几乎总是以分数形式出现。就您而言:
int coeff = fact(n) / (fact(n - r) * fact(r));
请注意,分母和分子的前min(n,n-r,r)
个因子相同。我不会为您提供代码,但希望有一个示例可以帮助您理解该怎么做。
考虑n=5
,r=3
,然后coeff
就是
5*4*3*2*1 / 2*1 * 3*2*1
在实际进行任何计算之前,您可以将其减少为
5*4 / 2*1
如果您确定最终结果coeff
确实适合int
,则也可以使用int
s进行计算。您只需要注意不要溢出中间条款。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。