【洛谷】P1009 阶乘之和

题目链接

题目描述

用高精度计算出 S=1!+2!+3!+…+n! (n≤50)

其中“!”表示阶乘,例如: 5!=5×4×3×2×1 。

输入输出格式

输入格式:

一个正整数 N 。

输出格式:

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

输入输出样例

输入样例#1: 复制

3

输出样例#1: 复制

9

简单的大数相加和大数相乘。

AC代码:

#include<iostream>
#include<sstream>
#include<algorithm>
#include<cstring>
#include<iomanip>
#include<vector>
#include<cmath>
#include<stack>
using namespace std;
string lan_add(string a,string b)//large number addition
{
	int la=a.length(),lb=b.length();
	//将字符串中字符转化为数字并倒序存储 
	int l=max(la,lb)+1,num1[l],num2[l];
	memset(num1,0,sizeof(num1));
	memset(num2,0,sizeof(num2));
	for(int i=0;i<la;i++) num1[i]=a[la-i-1]-'0';
	for(int i=0;i<lb;i++) num2[i]=b[lb-i-1]-'0';
	//la长度的数与lb长度的数之和长度不会超过max(la+lb)+1 ,模拟加法
	int c[l]={0};
	for(int i=0;i<l;i++)   c[i]=num1[i]+num2[i];
	//处理进位
	int carry=0;
	for(int i=0;i<l;i++)
	{
		c[i]+=carry;
		carry=c[i]/10;
		c[i]%=10;
	}	

	string ans;
	for(int i=l-1;i>=0;i--)  ans+=c[i]+'0';
        while(ans[0]=='0') {ans=ans.substr(1);}//去掉前导0  
	return ans;
}
string lan_mul(string a,string b)//large number multiplication
{
	int la=a.length(),lb=b.length();
	//将字符串中字符转化为数字并倒序存储 
	int num1[la],num2[lb];
	for(int i=0;i<la;i++) num1[i]=a[la-i-1]-'0';
	for(int i=0;i<lb;i++) num2[i]=b[lb-i-1]-'0';
	//la长度的数和lb长度的数乘积长度不会超过la+lb ,模拟乘法 
	int c[la+lb]={0};
	for(int i=0;i<la;i++)
	for(int j=0;j<lb;j++)
	c[i+j]+=num1[i]*num2[j];
	//处理进位
	int carry=0;
	for(int i=0;i<la+lb;i++)
	{
		c[i]+=carry;
		carry=c[i]/10;
		c[i]%=10;
	}	
	
	string ans;
	for(int i=la+lb-1;i>=0;i--)
	ans+=c[i]+'0';
	while(ans[0]=='0') {ans=ans.substr(1);}//去掉前导0  
	return ans;
}
string to_str(int n)//将整数转化为字符串 
{
	string ans;
	stringstream ss;
	ss<<n;
	ss>>ans;
	return ans;
}
int main()
{
	int N;cin>>N;
	string result="0",temp="1";
        for(int i=1;i<=N;i++)
        {
    	temp=lan_mul(temp,to_str(i));
    	result=lan_add(result,temp);
	}
	cout<<result;
}

猜你喜欢

转载自blog.csdn.net/qq_40889820/article/details/82082178
今日推荐