链接:https://ac.nowcoder.com/acm/contest/1069/C
来源:牛客网

题目描述 :
用高精度计算出S=1!+2!+3!+…+n!(n ≤ 50)其中“!”表示阶乘,例如:5!=54321。

输入描述:
输入正整数N

输出描述:
输出计算结果S

输入
3

输出
9

**思路:**由于50的阶乘比较大,long long 也无法储存,所以用字符串进行储存,进行大数加法和大数乘法;

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <cmath>
#include <string>
#include <iostream>
#include <queue>
#include <algorithm>
#include <set>
#include <map>
#include <vector>
#include <string.h>

using namespace std;

char s[10000], d[10000];   //储存从左至右为低位到高位

int p=0, pa=0;  //p表示s的最高位,pa表示d的最高位

void che(int k)  //大数乘法(d*k)
{
    int i, j=0, z;    //  j表示进位的数值
    for(i=0; i<=pa; i++)
    {
        z=j+(d[i]-48)*k;
        if(z>=10)
        {
            d[i]=z%10+48;
            j=z/10;
        }
        else
        {
            d[i]=z+48;
            j=0;
        }
    }
    while(j)
    {
        pa=pa+1;
        d[pa]=j%10+48;
        j=j/10;
    }
}

void jia() //大数加法
{
    int i, j=0, ma=0;  //  j表示进位的数值
    for(i=0; i<=p||i<=pa; i++)
    {
        if(j+s[i]-48+d[i]-48>=10)
        {
            s[i]=j+s[i]-48+d[i]-10;
            j=1;
        }
        else
        {
            s[i]=j+s[i]-48+d[i];
            j=0;
        }
    }
    ma=max(p,pa);
    while(j)
    {
        ma=ma+1;
        s[ma]=j%10+48;
        j=j/10;
    }
    p=ma;
}

int main()
{
    int n;
    scanf("%d",&n);
    for(int i=0; i<10000; i++)     //进行初始化处理;
    {
        s[i]='0';
        d[i]='0';
    }
    d[0]='1';
    for(int i=1; i<=n; i++)
    {
        che(i); //表示d=i*d;
        jia();      //表示s=s+d;
    }
    for(int i=p; i>=0; i--) //输出s;
    {
        printf("%c",s[i]);
    }
    printf("\n");
    return 0;
}

谢谢观看,望关注。