洛谷P1009 阶乘之和 题解

想看原题请点击这里:传送门

看一下原题:

题目描述
用高精度计算出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 }

猜你喜欢

转载自www.cnblogs.com/robertspot/p/12370027.html