问题描述
已知正整数N(N<=200)N(N<=200),设 S=1!+2!+3!+...N!S=1!+2!+3!+...N!。
其中"!!"表示阶乘,即N!=1*2*3*......*(N-1)*NN!=1∗2∗3∗......∗(N−1)∗N, 如: 3!=1*2*3=63!=1∗2∗3=6。
请编程实现:输入正整数 NN,输出计算结果 SS 的值。
输入数据 1
4
输出数据 1
33
解法
其实,这道题是高精度加法和乘法的混合
先写一个乘法函数:
vector<int>mul(vector<int>A,int b){
vector<int>C;
for(int i=0,t=0;i<A.size()||t;i++){
if(i<A.size()){
t+=A[i]*b;
}
C.push_back(t%10);
t/=10;
}
while(C.size()>1&&C.back()==0) C.pop_back();
return C;
}
再写一个加法函数:
vector<int>add(vector<int>A,vector<int>B){
if(A.size()<B.size()) return add(B,A);
vector<int>C;
for(int i=0,t=0;i<A.size()||t;i++){
if(i<A.size())t+=A[i];
if(i<B.size())t+=B[i];
C.push_back(t%10);
t/=10;
}
return C;
}
完整代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
vector<int>mul(vector<int>A,int b){
vector<int>C;
for(int i=0,t=0;i<A.size()||t;i++){
if(i<A.size()){
t+=A[i]*b;
}
C.push_back(t%10);
t/=10;
}
while(C.size()>1&&C.back()==0) C.pop_back();
return C;
}
vector<int>add(vector<int>A,vector<int>B){
if(A.size()<B.size()) return add(B,A);
vector<int>C;
for(int i=0,t=0;i<A.size()||t;i++){
if(i<A.size())t+=A[i];
if(i<B.size())t+=B[i];
C.push_back(t%10);
t/=10;
}
return C;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n;cin>>n;
vector<int>A,ANS;
A.push_back(1);
ANS.push_back(0);
for(int i=1;i<=n;i++){
A=mul(A,i);
ANS=add(ANS,A);
}
for(int i=ANS.size()-1;i>=0;i--){
cout<<ANS[i];
}
return 0;
}