阶乘之和(模板高精度)

阶乘之和

链接 : 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;
} 
posted @ 2020-12-27 16:05  在那遥远的悠穹下  阅读(259)  评论(0编辑  收藏  举报