微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我使用一些较大的大值时出现问题,我的函数输出错误

如何解决我使用一些较大的大值时出现问题,我的函数输出错误

因此,我是stackoverflow和编码的新手,正在学习c ++中的函数以及栈框架的工作方式等。 我做了一个阶乘函数,并用它来计算二项式系数。对于n = 10和r = 5等较小的值,它的工作效果很好。但是对于23C12等中等值,它的结果为4。

IDK代码有什么问题,或者我忘了添加一些东西。

我的代码

   #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=5r=3,然后coeff就是

  5*4*3*2*1 / 2*1 * 3*2*1

在实际进行任何计算之前,您可以将其减少为

  5*4 / 2*1

如果您确定最终结果coeff确实适合int,则也可以使用int s进行计算。您只需要注意不要溢出中间条款。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。