zl程序教程

您现在的位置是:首页 >  工具

当前栏目

第20届上海市青少年计算机应用操作竞赛 ☆线下赛 T1.阶乘求和

应用计算机 操作 20 竞赛 求和 阶乘 青少年
2023-09-27 14:25:47 时间

第20届上海市青少年计算机应用操作竞赛 ☆线下赛 T1.阶乘求和
内存限制: 256 Mb时间限制: 1000 ms
题目描述
n 的阶乘记为 n!,它的定义如下:
n!=1×2×⋯×n
给定一个正整数 n,请计算并输出
1!+2!+3!+⋯+n!
比如 1!+2!+3!=1+2+6=9。
输入格式
单个整数:表示 n。
输出格式
单个整数:表示 1! 到 n! 的和。
数据范围
对于 30% 的数据,1≤n≤12;
对于 60% 的数据,1≤n≤20;
对于 100% 的数据,1≤n≤100;
样例数据
输入:
3
输出:
9

题目难度不大  高精度乘法与高精度加法的基础应用  需要关注的细节比较多

#include<bits/stdc++.h>
using namespace std;
int num[305];
int jc[305]={0,1};
int lj=1,ln=1;
void mul(int n){
	int jw=0;
	for(int i=1;i<=lj;i++){
		jc[i]=jc[i]*n+jw;
		jw=jc[i]/10;
		jc[i]%=10;
	}
	while(jw>0){
		jc[++lj]=jw%10;jw/=10;
	}
}
void add(){
	int jw=0;
	ln=max(ln,lj);
	for(int i=1;i<=ln;i++){
		num[i]+=jc[i]+jw;
		jw=num[i]/10;
		num[i]%=10;
	}
	if(jw>0) num[++ln]=jw;
}
int main()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		mul(i);add();
	}
	while(ln>1&&num[ln]==0)ln--;
	for(int i=ln;i>=1;i--)cout<<num[i];
	return 0;
}