想看原题请点击这里:传送门
看一下原题:
题目描述 用高精度计算出S=1!+2!+3!+…+n! (n≤50) 其中“!”表示阶乘,例如:5!=5*4*3*2*1 5!=5×4×3×2×1。 输入格式 一个正整数N。 输出格式 一个正整数S,表示计算结果。 输入输出样例 输入 3 输出 9
如果这道题不需要用高精度的话那就变得很简单了,但由于我们看到了洛谷贴上了“高精度”的标签但由于这道题目是求阶乘和所以越往后n的阶乘就会越大。
又因为n!=n*(n-1!,所以有转移方程n!=n*(n-1)!避免重复运算(ROS只是唠叨一句防止有些人不知道忘记这一方法)
高精度也很平常,但ROS这道题debug了好久就是因为‘+=’写成了‘=’
所以写代码一个地方错了就会出现各种玄学bug呀
代码如下:
1 #include<bits/stdc++.h> 2 #define N 1000000 3 using namespace std; 4 int n; 5 int tmp[N]; 6 int lt; 7 int a[N]; 8 int la; 9 int lm; 10 void cal(int); 11 int main(){ 12 scanf("%d",&n); 13 tmp[1]=1; 14 lt=1; 15 for(int i=1;i<=n;i++){ 16 cal(i); 17 lm=max(lt,la); 18 for(int j=1;j<=lm;j++){ 19 a[j]+=tmp[j]; 20 } 21 for(int j=1;j<=lm;j++){ 22 a[j+1]+=a[j]/10; 23 a[j]%=10; 24 } 25 la=lm; 26 while(a[la+1]>0){ 27 la++; 28 a[la+1]+=a[la]/10; 29 a[la]%=10; 30 } 31 } 32 for(int i=la;i>2;i--){ 33 if(a[i]==0){ 34 la--; 35 continue; 36 } 37 break; 38 } 39 for(int i=la;i>=1;i--){ 40 printf("%d",a[i]); 41 } 42 return 0; 43 } 44 void cal(int x){ 45 for(int i=1;i<=lt;i++){ 46 tmp[i]*=x; 47 } 48 for(int i=1;i<=lt;i++){ 49 if(tmp[i]>=10){ 50 tmp[i+1]+=tmp[i]/10; 51 tmp[i]%=10; 52 } 53 } 54 while(tmp[lt+1]>0){ 55 lt++; 56 tmp[lt+1]+=tmp[lt]/10; 57 tmp[lt]%=10; 58 } 59 return ; 60 }