高精度:阶乘之和

题目描述

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

猜你喜欢

转载自www.cnblogs.com/ZhengLijie/p/12706671.html
今日推荐