2050: 【普及-】【P1009】求阶乘的和
内存限制:256 MB
时间限制:1.000 S
评测方式:文本比较
命题人:
提交:3
解决:3
题目描述
给定正整数n,求不大于n的正整数的阶乘的和(即求1!+2!+3!+...+n!),输出阶乘的和。
输入
输入有一行,包含一个正整数n(1 < n < 50)。
输出
输出有一行:阶乘的和。
样例输入 复制
5
样例输出 复制
153
提示

#include<iostream> #include<cstring> using namespace std; #define maxn 1000 struct Bigint { int len, a[maxn]; Bigint(int x = 0) { memset(a, 0, sizeof(a)); for (len = 1; x; len++) a[len] = x % 10, x /= 10; --len; } int &operator[](int i) { return a[i]; } void flatten(int L) { len = L; for (int i = 1; i <= L; ++i) { a[i + 1] += a[i] / 10; a[i] %= 10; } for (; !a[len];) len--; } void print() { for (int i = max(len, 1); i >= 1; --i) printf("%d", a[i]); } }; Bigint operator+(Bigint a, Bigint b) { Bigint c; int len = max(a.len, b.len); for (int i = 1; i <= len; ++i) c[i] += a[i] + b[i]; c.flatten(len + 1); return c; } Bigint operator*(Bigint a, int b) { Bigint c; int len = a.len; for (int i = 1; i <= len; ++i) c[i] = a[i] * b; c.flatten(len + 11); return c; } int main() { int n; cin>>n; Bigint ans(0),fac(1); for(int i=1;i<=n;++i) { fac=fac*i; ans=ans+fac; } ans.print(); return 0; }