点击查看代码
#include<bits/stdc++.h>
using namespace std;
vector<int> A,s;
int n;
//高精度加法的模板
vector<int> add(vector<int> A,vector<int> B)
{
if(A.size()<B.size()) return add(B,A);
vector<int> C;
int t=0;
//补位
for(int i=0;i<A.size()||t;++i){
t+=A[i];
if(i<B.size()) t+=B[i];//缓存位
C.push_back(t%10);//当前位
t=t/10;//进位
}
return C;
}
//高精度乘法的模板
vector<int> mul(vector<int> A,int b)
{
vector<int> C;
int t=0;
for(int i=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;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n;
string str="1";
//初始化高精度数组,使得可以存储高精度,为后面做铺垫
for(int i=str.size()-1;i>=0;--i) A.push_back(str[i]-'0');
for(int i=1;i<=n;i++){
A=mul(A,i);
s=add(s,A);
}
for(int i=s.size()-1;i>=0;--i) cout<<s[i];
}
是一道高精度的题目,阶乘的数值以外的大,如果是12的阶乘就超过int的范围,如果是20就超过long long的范围
因此需要高精度来处理,本题让我对模板有了更深的理解,补位,缓存位,当前位,进位,最后去前导0,都是这套逻辑
模板自不必说,如果不是简单的模板题也要学会手动用字符串设置一个高精度数