阶乘之和(模板高精度)
阶乘之和
链接 : P1009 阶乘之和
题目描述
用高精度计算出 $ S=1!+2!+3!+⋯+n! $
其中“!”表示阶乘,例如:$ 5!=5×4×3×2×14 $
输入格式
一个正整数 n
数据范围
对于100 %的数据,$ 1≤n≤50 $
求解
这个是很经典的高精度题!!!
(自测)用 long long类型只能AC两个点,不能拿到满分,
所以应该用高精度
我是抄洛谷书上题解的[doge]
由前面两个的图(加法和乘法),我们能发现每一位都需要进位,所以我们需要为了节省代码量,单独写一个函数
代码如下(模板):
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
struct bigint{ //创建大数类
int len;
int a[1000]; //可以根据需要调整a[i]中i的大小,一般1000足够
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<=len;i++)
{
a[i+1] += a[i] / 10;
a[i] %= 10;
}
for(;!a[len];)
len--;
}
void print() //输出数字
{
for(int i = max(1,len);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;
for(int i = 1;i<=a.len;++i)
c[i] = a[i] * b;
c.flatten(a.len+11);
return c;
}
int main()
{
bigint ans(0),fac(1); //封装一个类更好用
int m;
cin>>m;
for(int i = 1;i<=m;i++)
{
fac = fac * i;
ans = ans + fac;
}
ans.print();
return 0;
}