計算1+2!+3!+...+n!的和
阿新 • • 發佈:2022-12-08
計算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; }