阶乘在main中显示错误的答案.在函数中正确计算

Factorial showing wrong answer in main. Computed correctly in function

本文关键字:函数 答案 计算 错误 main 显示 阶乘      更新时间:2023-10-16

请解释以下行为的原因。正确答案是调试后的"3"。我想把它复制到"4"后面

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("%ldn",fact[n]);
    return 0;
}

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

不一定对应main中的n

试试修改后的版本,看看有什么不同:

#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("%ldn",fact[n]);
    return 0;
}

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

对于n >= 13,我们有

fact[13] = 6227020800不适合uint32_t

截断后,其新值变为1932053504(然后取模后为932053497)

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