C++ 阶乘主要显示错误答案。函数计算正确

C++ 阶乘主要显示错误答案。函数计算正确,c++,overflow,long-integer,factorial,C++,Overflow,Long Integer,Factorial,请解释以下行为的原因。 正确答案在调试“3”之后。我希望它在“4”之后被复制 long int事实[501]={0}; 长整数阶乘(整数n) { 如果(n==0 | | n==1) 返回1; 如果(事实[n]>1) 返回事实[n]; 如果((事实[n]=n*阶乘(n-1))>=100000007) {cout该行的输出 cout<<"3"<<endl<<fact[n]<<endl; 在编译器/平台上,您有4个字节的long int

请解释以下行为的原因。 正确答案在调试“3”之后。我希望它在“4”之后被复制

long int事实[501]={0};
长整数阶乘(整数n)
{
如果(n==0 | | n==1)
返回1;
如果(事实[n]>1)
返回事实[n];
如果((事实[n]=n*阶乘(n-1))>=100000007)

{cout该行的输出

        cout<<"3"<<endl<<fact[n]<<endl;

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

由于
n>=13
,我们有

fact[13]=6227020800
不适合
uint32\u t

当被截断时,它的新值变为1932053504(然后是模后的
932053497


要修复您的实现,您必须使用
uint64\t

为什么要使用
printf())在C++程序中,最好遵守“代码> STD::CUT<代码>。我认为可能有一些限制,即:STD::输出将创建溢出的限制。您输入什么作为<代码> N< /代码>?@ SCI,我认为这不重要。<代码>阶乘(n)< /Calp>目前返回事实[n]
。因此,两个输出都必须匹配,有无溢出。@Scis 14。阶乘交叉10^9+7的位置是最小值。这不起作用。尝试n=14,然后在3后调试,在4后调试。我不明白为什么它不必从main中获取n。好了,如果是同一个命名变量,它将获取最内部范围中的值s、 输出的n值取自main
factorial
是一个递归函数。条件
(事实[n]=n*factorial(n-1))>=100000007
n=13
时为真,但在
n=14
时为假。在“3”之后获得输出仅适用于
n=13
@RSahu:事实上,如果没有32位截断,该条件也适用于
n==14
^^()@Jarod42良好点。当使用
unit64\u t
时,13到30之间的所有数字似乎都是如此。30之后没有进行测试。
        cout<<"3"<<endl<<fact[n]<<endl;
#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;
}