深入浅出学算法020-阶乘和(sum)

该程序用于计算1到N的阶乘之和,使用了自定义的高精度乘法和加法函数,以处理超过普通数据类型限制的大整数运算。通过逐次计算每个数的阶乘并累加到总和中,最终输出结果。
摘要由CSDN通过智能技术生成
题目描述

已知正整数N(N<=100),设S=1!+2!+3!+…N!。其中"!"表示阶乘,即N!=123*……(N-1)N,如:3!=123=6。请编程实现:输入正整数N,输出计算结果S的值。

输入

输入一个整数n( 1<= n<=100)

输出

输出s的值

样例输入
4
样例输出
33

这里n最大为100,普通的数据类型无法满足运算,要使用高精度求积和高精度求和才能计算出准确答案

#include<iostream>
#include<cstdlib>
#include<string>
#include<algorithm>
#include<cmath>
using namespace std;

// 超长整数*个位数 
string small_mul(string s1,int c1){
	if(c1==0) return "0";
	else if(c1==1) return s1;
	
	reverse(s1.begin(),s1.end());
	string sum="";
//	cc表示进位 
	int temp=0,cc=0;
	
	for(int i=0;i<s1.length();i++){
		temp=(s1[i]-'0')*c1+cc;
		cc=temp/10;
		sum+=temp%10+'0';
	}
	if(cc!=0)sum+=cc+'0';
	reverse(sum.begin(),sum.end());
	return sum;
}

string get_sum(string s1,string s2){
	reverse(s1.begin(),s1.end());
	reverse(s2.begin(),s2.end());
	string sum="";
	int temp=0,cc=0;
	
	string maxstr=s1.length()>s2.length()? s1:s2;
	int minlen=s1.length()>s2.length()? s2.length():s1.length();
	
	for(int i=0;i<minlen;i++){
		temp=(s1[i]-'0')+(s2[i]-'0')+cc;
		cc=temp/10;
		sum+=temp%10+'0';
	}
//	考虑两个加数位数不同 
	for(int i=minlen;i<maxstr.length();i++){
		temp=(maxstr[i]-'0')+cc;
		cc=temp/10;
		sum+=temp%10+'0';
	}
//	考虑到最高位仍有进位 
	if(cc!=0)sum+=cc+'0';
	reverse(sum.begin(),sum.end());
	return sum;
}

string big_mul(string s1,string s2){
	reverse(s2.begin(),s2.end());
	int add=0;
	string sum="",tempstr="";
	for(int i=0;i<s2.length();i++){
		tempstr=small_mul(s1,s2[i]-'0');
//		每加一次0,就相当于乘以10,乘法需要依次乘1,10,100,1000... 
		for(int k=0;k<add;k++){
			tempstr+='0';
		}
		sum=get_sum(sum,tempstr);
		add++;
	}
	return sum;
} 




int main(){
	int n;
	cin>>n;
	string sum="",temp="1";
	for(int i=1;i<=n;i++){
//		temp储存N! 
		temp=big_mul(temp,to_string(i));
		sum=get_sum(sum,temp);
	}
	
	cout<<sum<<endl;
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值