【9104】&&【a103】阶乘和

Time Limit: 10 second
Memory Limit: 2 MB

问题描述
已知正整数n(n≤100),设s=1!+2!+3!+...+n!。其中“!”表示阶层,即n!=1*2*3*...*(n-1)*n,如:3!=1*2*3=6。请编程实现:输入正整数n,输出计算结果s的值。

Input

文件输入仅一行,输入n

Output

s的值。

Sample Input

4

Sample Output

33

【题解】

先处理阶乘,这个是高精度乘单精度,然后在一边处理阶乘的时候,一边加起来,即高精度加法。

【代码】

#include <cstdio>

int n,a[300],b[300],la = 1 ,lb = 1; //a数组用于存储阶乘,b数组用于存储当前的阶乘和。

void input_data()
{
    scanf("%d",&n);
    for (int i = 1;i <= 299;i++) //初始化所有的数字为0
        a[i] = 0,b[i] = 0;
    a[1] = 1; //0!== 1
}

void get_ans()
{
    for (int i = 1;i <= n;i++) //开始获取前n个阶乘的和。
        {
            int x = 0;
            for (int j = 1;j <= la;j++) // 乘上i,同时一边处理进位
                {
                    a[j] = a[j] * i + x;
                    x = a[j] / 10;
                    a[j] = a[j] % 10;
                }
            while (x > 0) //如果这个数的位数还可以变大 就用while让其变大。
                {
                    la++;
                    a[la] += x;
                    x = a[la] / 10;
                    a[la] = a[la] % 10;
                }
            x = 0;//接下来处理加法
            int l;
            if (la > lb) //先判断哪一个数比较大,获取他的长度 用于做加法
                l = la;
                    else
                        l = lb;
            for (int j = 1;j <= l;j++) //开始加上去 一边处理进位
                {
                    b[j] = b[j] + a[j] + x;
                    x = b[j] / 10;
                    b[j] = b[j] % 10;
                }
            while (x > 0) //如果可以增加长度则增加长度
                {
                    l++;
                    b[l] += x;
                    x = b[l] / 10;
                    b[l] = b[l] % 10;
                }
            lb = l; //更新b数组的长度
        }
}

void output_ans() //最后b数组逆序输出即可。
{
    for (int i = lb;i >= 1;i--)
        printf("%d",b[i]);
}

int main()
{
    //freopen("F:\rush.txt","r",stdin);
    input_data();
    get_ans();
    output_ans();
    return 0;
}

原文地址:https://www.cnblogs.com/AWCXV/p/7632434.html