因子在主要部分显示错误答案。在功能上正确计算

时间:2014-05-30 19:09:12

标签: c++ overflow long-integer factorial

请解释以下行为的原因。 正确的答案是在调试" 3"之后。我希望在" 4"。

之后将其复制到main中
long int fact[501]={0};

long int factorial(int n)
{
    if(n==0 || n==1)
            return 1;
    if(fact[n]>1)
            return fact[n];

    if((fact[n]=n*factorial(n-1))>=1000000007)
    {       cout<<"2"<<endl<<fact[n]<<endl;
            fact[n]=fact[n]%1000000007;
            cout<<"3"<<endl<<fact[n]<<endl;
    }return fact[n];
}

int main()
{
    int n;
    cin>>n;
    cout<<"1"<<endl;
    cout<<factorial(n)<<endl;
    cout<<"4"<<endl;
    printf("%ld\n",fact[n]);
    return 0;
}

2 个答案:

答案 0 :(得分:1)

的输出
        cout<<"3"<<endl<<fact[n]<<endl;

不一定与n中的main相对应。

尝试使用此修改后的版本来查看差异:

#include <stdio.h>
#include <iostream>
using namespace std;

long int fact[501]={0};

long int factorial(int n)
{
    if(n==0 || n==1)
            return 1;
    if(fact[n]>1)
            return fact[n];

    if((fact[n]=n*factorial(n-1))>=1000000007)
    {       cout<<"2"<<endl<<fact[n]<<endl;
            fact[n]=fact[n]%1000000007;
            cout<<"3"<<endl<<n<<" "<<fact[n]<<endl;
    }return fact[n];
}

int main()
{
    int n;
    cin>>n;
    cout<<"1"<<endl;
    cout<<factorial(n)<<endl;
    cout<<"4"<<endl;
    printf("%ld\n",fact[n]);
    return 0;
}

答案 1 :(得分:0)

使用您的编译器/平台,long int有4个字节,因此您的值被截断

使用n >= 13,我们有

fact[13] = 6227020800不适合uint32_t

截断时,其新值转到1932053504(然后以模数后932053497

要修复您的实施,您必须使用uint64_t。 (https://ideone.com/gQrxyW