P1009 阶乘之和

点击查看代码
#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,都是这套逻辑 模板自不必说,如果不是简单的模板题也要学会手动用字符串设置一个高精度数
posted @ 2025-11-22 00:39  AnoSky  阅读(4)  评论(0)    收藏  举报