#include<bits/stdc++.h> using namespace std; int a[1000]={1},s[1000]={1}; int main(){ int n; cin>>n; for(int i=2;i<=n;i++) { for(int j=0;j<=100;j++) { a[j]*=i; } for(int j=0;j<=100;j++) { if(a[j]>9) { a[j+1]+=(a[j]/10); a[j]%=10; } } for(int j=0;j<=100;j++) { s[j]+=a[j]; if(s[j]>9) { s[j+1]+=(s[j]/10); s[j]%=10; } } } int len=1000; for(int i=1000;i>=0;i--) { if(s[i]==0) { len--; } } for(int i=len-1;i>=0;i--) { printf("%d",s[i]); } return 0; } 为什么结果不对?
时间: 2024-03-17 15:44:23 浏览: 86
这段代码存在一些问题:
1. 高精度数组的长度只有1000,但是在循环中使用的下标却是100,这会导致数组越界的问题,应该统一使用数组长度作为下标。
2. 在计算阶乘时,每次都需要将a数组清零,否则会对后面的计算产生影响。
3. 在统计结果的位数时,应该从数组的最高位开始遍历,否则可能会出现统计错误的情况。
下面是修改后的代码:
```
#include<bits/stdc++.h>
using namespace std;
int a[1000]={1},s[1000]={1};
int main(){
int n;
cin>>n;
for(int i=2;i<=n;i++)
{
memset(a,0,sizeof(a)); // 每次计算前将a数组清零
for(int j=0;j<1000;j++) // 统一使用数组长度作为下标
{
a[j]*=i;
}
for(int j=0;j<1000;j++)
{
if(a[j]>9)
{
a[j+1]+=(a[j]/10);
a[j]%=10;
}
}
for(int j=0;j<1000;j++)
{
s[j]+=a[j];
if(s[j]>9)
{
s[j+1]+=(s[j]/10);
s[j]%=10;
}
}
}
int len=1000;
for(int i=999;i>=0;i--) // 从数组的最高位开始遍历
{
if(s[i]==0)
{
len--;
}
else break;
}
for(int i=len-1;i>=0;i--)
{
printf("%d",s[i]);
}
return 0;
}
```
这样就可以正确计算阶乘了。
阅读全文