重操旧业啦
用高精度计算出S=1!+2!+3!+…+n! (n≤50)
其中“!”表示阶乘,例如:5!=5×4×3×2×1。
一个正整数N。
一个正整数S,表示计算结果。
一道显然的高精度乘法在做加法,n<13爆做,不爆int。n>=13高精度;
值得注意的一点是,题目要求求阶乘并加和,写题时容易误写成求阶乘,忘记加和;
具体注释已经放进了代码里
#include<cstdio> int a[10005],g[10005],s[10005],b[10005],he[10005]; int main() { int n,i,j,ans,sum=0,ge,shi,jin,t=10; scanf("%d",&n); if(n<=12) { for(i=1;i<=n;i++) { ans=1; for(j=1;j<=i;j++) ans*=j; sum+=ans; } printf("%d",sum); return 0; } else { for(i=1;i<=12;i++) { ans=1; for(j=1;j<=i;j++) ans*=j;//ans为阶乘 sum+=ans;//sum为12以内阶乘和 } for(i=1;;i++) { if(sum==0)break; a[i]=sum%10;//a数组表示阶乘加和 b[i]=ans%10;//b数组表示各数阶乘 sum/=10;ans/=10; } for(j=13;j<=n;j++)//从13开始高精度求阶乘 { ge=j%10;shi=j/10;jin=0; for(i=1;i<=t+10;i++) { ans=b[i]*ge; g[i]=ans%10+jin;//g数组为j的个位乘大数 if(g[i]>=10){g[i]%=10;jin=1;} else jin=0; jin+=ans/10; } jin=0; for(i=1;i<=t+10;i++) { ans=b[i]*shi; s[i+1]=ans%10+jin;//s数组为j的十位乘大数 if(s[i]>=10){s[i]%=10;jin=1;} else jin=0; jin+=ans/10; } jin=0;he[1]=g[1]; for(i=2;i<=t+10;i++) { he[i]=g[i]+s[i]+jin; if(he[i]>=10){he[i]%=10;jin=1;} else jin=0; }//求和即在he中表示出j的阶乘 for(i=1;i<=t+10;i++) { b[i]=he[i]; //b替换为j的阶乘,方便下次计算 a[i]=a[i]+he[i]+jin; if(a[i]>=10){a[i]%=10;jin=1;} else jin=0; }//再次求和,得出j内阶乘和 for(i=1;i<=t+10;i++) if(a[i]!=0)t=i;//用t计录答案位数 } for(i=t;i>=1;i--) printf("%d",a[i]);//输出 return 0; } }
原文:https://www.cnblogs.com/wisdom-jie/p/13583336.html