高精度:阶乘之和
Posted zhenglijie
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高精度:阶乘之和相关的知识,希望对你有一定的参考价值。
题目描述
用高精度计算出S=1!+2!+3!+…+n!(n≤50)S=1!+2!+3!+…+n! (n≤50)S=1!+2!+3!+…+n!(n≤50)
其中“!”表示阶乘,例如: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 }
以上是关于高精度:阶乘之和的主要内容,如果未能解决你的问题,请参考以下文章