1. 程式人生 > 其它 >計算1+2!+3!+...+n!的和

計算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;
}