计算1+2!+3!+...+n!的和

计算1+2!+3!+...+n!的和

Code

点击查看代码
#include<iostream>
#include<vector>
using namespace std;
typedef vector<int> VI;		//动态数组
int n;
VI add(VI &A, VI &B)   //高精度加法
{
    if (A.size() < B.size()) return add(B, A);   //使A长度大于B

    VI C;   //接收计算结果
	
    int t=0;	//保存进位
        
    for (int i = 0; i < A.size(); i ++ )	//以长度长的作循环
    {
        t += A[i];   
        if (i < B.size()) t += B[i];     //如果B没有加完
        C.push_back(t % 10);   //结果mod 10
        t /= 10;    //进位
    }

    if (t) C.push_back(t);    //结果长度可能长于长度最长的数
    return C;	//返回结果
}

VI mul(VI &A,int b){		//高精度与低精度乘法
	VI C;		//接收结果
	int t = 0;	//保存进位
	for(int i = 0; i <= A.size()-1 || t;i++){	//如果没有乘完或者进位不为0
		if(i <= A.size()-1)t += A[i] * b;	//相乘
		C.push_back(t % 10);	//结果mod 10
		t /= 10;	//进位
	}
	while(C.size() > 1&&C.back() == 0)C.pop_back();	//除去前导0(可能高进度乘0)
	return C;	//返回结果
}

int main(){
	VI A; 	//每次保存阶乘
	VI C;	//保存阶乘之和
	C.push_back(0);	//初始化为0
	cin >> n;
	for(int i = 1; i <= n; i ++){
		A.erase(A.begin(),A.end());		//每次用完要清空
		A.push_back(1);		//初始化为1再求阶乘
		for(int j = i;j >= 1; j--){
			A = mul(A,j);		//求阶乘
		}	
		C = add(C,A);		//阶乘之和
	}
	for(int i = C.size() - 1; i >= 0; i -- )cout << C[i];	//逆序输出
	return 0;
}
posted @ 2022-12-08 15:04  Keith-  阅读(19)  评论(0编辑  收藏  举报