题目描述
用高精度计算出 S=1!+2!+3!+…+n! (n≤50)S=1!+2!+3!+…+n!(n≤50)
其中“!”表示阶乘,例如: 5!=5 imes 4 imes 3 imes 2 imes 15!=5×4×3×2×1 。
输入输出格式
输入格式:
一个正整数 NN 。
输出格式:
一个正整数 SS ,表示计算结果。
输入输出样例
输出样例#1:
View Code
9
1 #include <cstdio> 2 #include <algorithm> 3 #include <cstring> 4 #include <math.h> 5 #include <iostream> 6 7 using namespace std; 8 9 struct num { 10 int a[100]; 11 num(){ memset(a, 0, sizeof(a)); } 12 num(int x) { 13 memset(a, 0, sizeof(a)); 14 int i = 0; 15 while (x) { 16 i++; 17 a[i] = x % 10; 18 x /= 10; 19 } 20 a[0] = i; 21 } 22 num operator +(num p) { 23 int l = max(a[0], p.a[0]); 24 num ans; 25 for (int i = 1; i <= l; i++) { 26 ans.a[i] += a[i] + p.a[i]; 27 if (ans.a[i] > 9) { 28 ans.a[i] -= 10; 29 ans.a[i + 1]++; 30 } 31 } 32 if (ans.a[l + 1] != 0)l++; 33 ans.a[0] = l; 34 return ans; 35 } 36 num operator *(num p) { 37 num ans; 38 for(int i=1;i<=a[0];i++) 39 for (int j = 1; j <= p.a[0]; j++) { 40 ans.a[i + j - 1] += a[i] * p.a[j]; 41 ans.a[i + j ] += ans.a[i + j - 1] / 10; 42 ans.a[i + j - 1] %= 10; 43 ans.a[0] = max(ans.a[0], i + j - 1); 44 if (ans.a[i + j ] != 0) 45 ans.a[0] = max(ans.a[0], i + j ); 46 } 47 return ans; 48 } 49 void print() { 50 printf("%d", a[a[0]]); 51 for (int i = a[0] - 1; i >= 1; i--) 52 printf("%d", a[i]); 53 printf(" "); 54 } 55 }; 56 57 int main() 58 { 59 int n; 60 scanf("%d", &n); 61 num tmp(1),ans(0); 62 for (int i = 1; i <= n; i++) { 63 tmp=tmp*i; 64 ans = ans + tmp; 65 } 66 ans.print(); 67 return 0; 68 }
可当模板