高精度:阶乘之和

Posted zhenglijie

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高精度:阶乘之和相关的知识,希望对你有一定的参考价值。

题目描述

用高精度计算出S=1!+2!+3!+…+n!(n≤50)S=1!+2!+3!+…+n! (n≤50)S=1!+2!+3!++n!(n50)

其中“!”表示阶乘,例如:5!=5×4×3×2×1

输入格式

一个正整数NNN。

输出格式

一个正整数SSS,表示计算结果。

输入输出样例

输入 #1 
3
输出 #1 
9
思路:用到了两种高精度,阶乘高精度和加法高精度。

高精度阶乘有两种代码:
 1 void JieCheng(int a[], int c)
 2 {
 3     for (int i = 2; i <= c; i++)
 4     {
 5         int jw = 0;
 6         int j = 0;
 7         int temp;
 8 
 9         while (j < length)
10         {
11             temp = jw;
12             jw = (a[j] * i + jw) / 10;
13             a[j] = (a[j] * i + temp) % 10;
14             j++;
15         }
16     }
17 }

这种好像不太好理解不太好想,这种需要每求一次阶乘清一次数组,而且时间复杂度也高。

另外一种:

 

 1 void cheng(int *a,int c)
 2 {
 3     int jw=0;
 4     for(int i=1;i<=1000;i++)
 5     {
 6         a[i]=a[i]*c+jw;
 7         jw=a[i]/10;
 8         a[i]%=10;
 9     }
10 }

 

这种就不需要清数组,提高了很大效率。

高精度加法代码:

 

 1 void pplus(int a[], int c[])
 2 {
 3     int jw = 0;
 4     
 5     for (int i = 1; i < length; i++)
 6     {
 7         c[i] += a[i] + jw;
 8         jw = c[i] / 10;
 9         c[i] %= 10;
10     }
11 }

最后就判断条件倒序输出即可

 

 1 #include<iostream>
 2 #include<cstring>
 3 
 4 using namespace std;
 5 const int length = 2000;
 6 
 7 void JieCheng(int a[], int c)
 8 {
 9     for (int i = 2; i <= c; i++)
10     {
11         int jw = 0;
12         int j = 0;
13         int temp;
14 
15         while (j < length)
16         {
17             temp = jw;
18             jw = (a[j] * i + jw) / 10;
19             a[j] = (a[j] * i + temp) % 10;
20             j++;
21         }
22     }
23 }
24 
25 void pplus(int a[], int c[])
26 {
27     int jw = 0;
28     
29     for (int i = 1; i < length; i++)
30     {
31         c[i] = c[i] + a[i] + jw;
32         jw = c[i] / 10;
33         c[i] %= 10;
34     }
35 }
36 
37 int main()
38 {
39     int a[length];
40     int c[length];
41     int n, sum = 0;
42 
43     memset(a, 0, sizeof(a));
44     memset(c, 0, sizeof(a));
45     cin >> n;
46     if (n == 0)
47     {
48         cout << "0";
49         return 0;
50     }
51     a[1] = 1;
52     for (int i = 1; i <= n; i++)
53     {
54         JieCheng(a, i);
55         pplus(a, c);
56         memset(a, 0, sizeof(a));
57         a[1] = 1;
58     }
59     
60     int flag = 0;
61     for (int i = length-1; i >= 1; i--)
62     {
63         if (c[i] != 0)
64             flag = 1;
65         if (flag)
66             cout << c[i];
67         
68     }
69     return 0;
70 }

 

 

 

 

 

 

 

以上是关于高精度:阶乘之和的主要内容,如果未能解决你的问题,请参考以下文章

洛谷 P1009 阶乘之和

AC日记——阶乘之和 洛谷 P1009(高精度)

洛谷——P1009 阶乘之和

P1009 阶乘之和

P1009 阶乘之和

求阶乘之和