洛谷P1009 [NOIP 1998 普及组] 阶乘之和

P1009 [NOIP 1998 普及组] 阶乘之和

题目描述

用高精度计算出 S = 1 ! + 2 ! + 3 ! + ⋯ + n ! S = 1! + 2! + 3! + \cdots + n! S=1!+2!+3!++n! n ≤ 50 n \le 50 n50)。

其中 ! 表示阶乘,定义为 n ! = n × ( n − 1 ) × ( n − 2 ) × ⋯ × 1 n!=n\times (n-1)\times (n-2)\times \cdots \times 1 n!=n×(n1)×(n2)××1。例如, 5 ! = 5 × 4 × 3 × 2 × 1 = 120 5! = 5 \times 4 \times 3 \times 2 \times 1=120 5!=5×4×3×2×1=120

输入格式

一个正整数 n n n

输出格式

一个正整数 S S S,表示计算结果。

输入输出样例 #1

输入 #1

3

输出 #1

9

说明/提示

【数据范围】

对于 100 % 100 \% 100% 的数据, 1 ≤ n ≤ 50 1 \le n \le 50 1n50

【其他说明】

注,《深入浅出基础篇》中使用本题作为例题,但是其数据范围只有 n ≤ 20 n \le 20 n20,使用书中的代码无法通过本题。

如果希望通过本题,请继续学习第八章高精度的知识。

NOIP1998 普及组 第二题

//1009
#include
using namespace std;
#define maxn 100
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<=len;++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()
 {
 	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;
 }

你可能感兴趣的:(高精度,模拟,P1998)