请解释以下行为的原因。 正确的答案是在调试" 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;
}
答案 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)