阶乘计算 高精度

阶乘之和 高精度

题目描述

用高精度计算出 S=1!+2!+3!+⋯+n!(n*≤50)。

其中“!”表示阶乘,例如:15!=5×4×3×2×1。

输入格式

一个正整数 n。

输出格式

一个正整数 S,表示计算结果。

输入输出样例

输入 #1

3

输出 #1

9

说明/提示

【数据范围】

对于 100% 的数据,1≤n≤50。

思路就是高精乘+高精加,就是把高精乘的模板套上去接着套高精加的模板,b=c=i的阶乘。

#include<bits/stdc++.h> //万能头文件
using namespace std;
int a[100], b[100], i, j, c[100];
int f[100];
int len_a;
int len_b = 1;
int len_c = 1;
int m = 1;
int main () {
    int n;
    cin>>n;
    b[1] = 1;
    for (int x = 1; x <= n; x++) {
        len_a = 0;
        int p = x;
        while (p > 0) {
            a[++len_a] = p % 10;
            p /= 10;
        }
        for (i = 1; i <= len_a; i++) {
            for (j = 1; j <= len_b; j++) {
                c[i + j - 1] += a[i] * b[j];
            }
        }
        len_c = len_a + len_b;
        len_b = len_c;
        m = max(m, len_c);
        for (i = 1; i < len_c; i++) {
            if (c[i] > 9) {
                c[i + 1] += c[i] / 10;
                c[i] %= 10;
            }
        }
        for (int k = 1; k <= len_c; k++) {
            b[k] = c[k];
        }
        memset(c, 0, sizeof (c));
        for (int j = 1; j < m; j++) {
            f[j] += b[j];
            if (f[j] > 9) {
                f[j + 1] += f[j] / 10;
                f[j] %= 10;
            }
        }
    }
    while(!f[m] && m > 0) {
        m--; //去掉首导零
    }
    for(i = m;i>= 1;i--) {
        cout<<f[i]; //倒序输出
    }
    return 0; //圆满结束
}
posted @ 2021-05-05 14:33  JK~  阅读(335)  评论(0编辑  收藏  举报