2050: 【例】【普及-】【P1009】求阶乘的和
内存限制:256 MB
时间限制:1.000 S
评测方式:文本比较
命题人:
提交:9
解决:7
题目描述
给定正整数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;
}