这是一个计算数字阶乘的程序,我将它存储在一个向量中。该程序适用于高达30的输入,但对于n = 40或更高,它会产生一个奇怪的输出。 例如
输入:
3
4
30
40
输出:
24
265252859812191058636308480000000
-190350521-236-6-6-5-745611269596115894272000000000
这个 - 标志来自哪里?
#include<vector>
#include<cstdio>
#include<algorithm>
using namespace std;
vector<int> solve(int n){
if(n==1){
vector<int> ans;
ans.push_back(1);
return ans;
}
vector<int> b=solve(n-1);
int temp=0,x=0;
for(int i=0;i<b.size();i++){
x=b[i]*n+temp;
b[i]=x%10;
temp=x/10;
}
if(temp!=0)
b.push_back(temp);
return b;
}
int main(){
int t,n,i;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
vector<int> ans=solve(n);
for(int j=ans.size()-1;j>=0;j--)
printf("%d",ans[j]);
printf("\n");
}
}
答案 0 :(得分:1)
这是整数溢出。固定大小的整数只能保存如此大的值然后溢出。您可能希望使用任意精度整数库,如GMP。
使用这些更改运行代码,这将变得很明显:
vector<int> solve(int n)
{
if(n==1){
vector<int> ans;
ans.push_back(1);
return ans;
}
vector<int> b=solve(n-1);
int temp=0,x=0;
cout << "b.size=" << b.size() << ", n=" << n << endl;
for(int i=0;i<b.size();i++){
x=b[i]*n+temp;
cout << "b[ " << i << "]=" << b[i] << ", temp= " << temp << ", x=" << x << endl;
b[i]=x%10;
temp=x/10;
}
if(temp!=0)
{
cout << "push_back(" << temp << ")" << endl;
b.push_back(temp);
}
return b;
}