孟令然2013 @ 2024-08-09 15:03:15
#include<iostream>
#include<string.h>
using namespace std;
long long n,a[100005],ans[100005],tmp,tmp2;
int main()
{
cin>>n;
for(int i=n;i>=1;i--)
{
memset(a,0,sizeof(a));
a[1]=1;
tmp=1;
for(int j=1;j<=i;j++)
{
tmp2=0;
for(int k=tmp;k>=1;k--)
{
a[k]*=j;
if(a[k]>=10)
{
a[k+1]+=a[k]/10;
a[k]%=10;
tmp2++;
}
}
tmp+=tmp2;
}
for(int j=1;j<=tmp;j++)
{
ans[j]+=a[j];
if(ans[j]>=10)
{
ans[j+1]+=ans[j]/10;
ans[j]%=10;
}
}
}
int flag=0;
for(int i=n;i>=1;i--)
{
if(ans[i]!=0&&!flag)
{
flag=1;
}
if(flag)
{
cout<<ans[i];
}
}
return 0;
}
75分...
by Xingyi_2014 @ 2024-08-14 11:43:50
我也是用的高精度,代码给你看一下,觉得还行就给个关注呗!
#include<iostream>
using namespace std;
int main(){
int s1[300]={1},s2[300]={0},len=0;
int n;
cin>>n;
for(int i=1;i<=n;i++){
for(int j=0;j<=len;j++){
s1[j]*=i;
}
for(int j=0;j<=len;j++){
if(s1[j]>=10){
if(j==len){
len++;
}
s1[j+1]+=s1[j]/10;
s1[j]%=10;
}
}
for(int j=0;j<=len;j++){
s2[j]+=s1[j];
if(s2[j]>=10){
s2[j+1]+=s2[j]/10;
s2[j]%=10;
}
}
}
for(int i=len;i>=0;i--){
cout<<s2[i];
}
return 0;
}
100分
by Xingyi_2014 @ 2024-08-14 11:50:55
@孟令然2013
输出部分:在输出结果时,有时候会出现遗漏。例如,如果所有位数都是零,应该确保输出 0。
初始化问题:在每次阶乘计算开始时,可能需要重置 ans 数组,以避免上次计算结果影响当前计算