50分啊QWQ 帮下蒟蒻-&

P1009 [NOIP1998 普及组] 阶乘之和

荒泷一斗 @ 2022-08-27 13:36:34

我的思路

制作函数,算阶乘,然后for循环导入函数,变量储值,输出。

好了,大佬想听的话我也说完了

呈上代码:

#include<bits/stdc++.h>
using namespace std;

int jiecheng(int zx)//函数计算阶乘
{
    int k=1;
    for(int i=1;i<=zx;i++)
    {
        k*=i;
    }
    return k;//返回阶乘的值
    k=1;//完成后赋值
}

int main()//主程序
{
    int n,jc=0;
    cin>>n;
    for(int i=1;i<=n;i++)//1到n的阶乘
    {
        jc+=jiecheng(i);//储值
    }
    cout<<jc;
}

大佬求助


by CarDriveer @ 2022-08-27 13:38:36

@arageg_bzn_0228 阶乘很大,要用高精度


by fengziyi @ 2022-08-27 13:49:03

@arageg_bzn_0228 请学习高精度算法


by lzy20040530 @ 2022-09-15 12:36:41

使用高精度,因为它可能会溢出

#include<iostream>
#include<vector>
using namespace std;
vector<int> add(vector<int>&v1,vector<int>&v2)
{
    vector<int>res;
    int t=0;
    int i=0;
    while(i<v1.size() || i<v2.size() || t)
    {
        if(i<v1.size())
        {
            t+=v1[i];
        }
        if(i<v2.size())
        {
            t+=v2[i];
        }
        res.push_back(t%10);
        t/=10;
        i++;
    }
    return res;
}
vector<int> mul(vector<int>&A,int B)
{
    vector<int>res;
    for(int i=0,t=0;i< A.size() || t;i++)
    {
        if(i<A.size())
        {
            t+=A[i]*B;
        }
        res.push_back(t%10);
        t/=10;
    }
    while(res.size()>1 && res.back() == 0)
    {
        res.pop_back();
    }
    return res;
}
int main()
{
    vector<int>v1{0},v2{1};
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        v2=mul(v2,i);
        v1=add(v1,v2);
    }
    for(int i=v1.size()-1;i>=0;i--)
    {
        cout<<v1[i];
    }
    return 0;
}

|