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

题目描述

用高精度计算出 S=1!+2!+3!+⋯+n!(n≤50)。
其中“!”表示阶乘,例如:5!=5×4×3×2×1。

输入格式

一个正整数 n。

输出格式

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

输入输出样例

输入:3
输出:9

说明/提示

【数据范围】
对于100% 的数据,1≤n≤50。
【其他说明】
注,《深入浅出基础篇》中使用本题作为例题,但是其数据范围只有 n≤20,使用书中的代码无法通过本题。
如果希望通过本题,请继续学习第八章高精度的知识。

解题思路:

这是一道高精度的题,n的最大值达到了50,即使用unsigned long long 数据类型也会超出范围,因此需要模拟手写计算过程,如果不理解的话可以自己动手算一算。使用两个数组分别记录当前的阶乘数值和相加之后得到的数值,数组中的每个元素只用来记录一个数字,连在一起才是阶乘或相加之后的数值。

AC代码:

#include <bits/stdc++.h>
using namespace std;
int a[1000];//存储阶乘得到的每一位数 
int b[1000];//存储当前相加和得到的每一位数                  
int main()
{
 	int n;
 	cin>>n;
 	for(int i=0;i<1000;i++)
 	{
 		a[i]=b[i]=0;
	 }
 	a[1]=1;
 	for(int i=1;i<=n;i++)
	{
		int temp=0;
		for(int j=1;j<=1000;j++)//模拟手写乘法,注意进位
		{
			a[j]=a[j]*i+temp;
			temp=a[j]/10;
			a[j]=a[j]%10;
		}
		temp=0;
		for(int j=1;j<=1000;j++)//模拟手写加法,注意进位
		{
			b[j]=b[j]+a[j]+temp;
			temp=b[j]/10;
			b[j]=b[j]%10;
		}
 	}
	 int k;
	 for(int i=999;i>=0;i--)//因为最高位不可能为0,所以从后往前找到第一个不为0的数
	 {
	 	if(b[i]!=0)
	 	{
	 		k=i;break;
 		}
	 }
	 
	 for(int i=k;i>=1;i--)//从后往前输出,直到i为1
	 {
	 	cout<<b[i];
	 }
	 
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值