Bootstrap

【无标题】

描述

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

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

输入正整数N,输出计算结果S。

输入

一个正整数N。

输出

计算结果S。

样例输入

5

样例输出

153

分析

数据类型表达不了像50!这样大的数,故必须用到数组,使数据的每一位相加,推荐大家先去看一下高精度的计算这篇文章http://t.csdn.cn/5IZMJ

本题需要用到大数阶乘和大数加法的结合,先算出来阶乘,然后每算出来一次,就加上,最后输出。

代码

#include<stdio.h>
#include<string.h>
int main()
{
    int n, i, j, k;
    int len = 1;      //表示阶乘数组位数
    int length1 = 1;   //结果数组位数
    int arr[100],sum[100];
    memset(arr, 0, sizeof(arr));    //初始化为0
    memset(sum, 0, sizeof(sum));
    arr[0] = 1;     //第一位默认为1
    scanf("%d", &n);
    for (i = 1; i <= n; i++)   //得出n的阶乘的和
    {
        //求阶乘
        for (j = 0; j < len; j++)
        {
            arr[j] *= i; //这个最后自己手写一遍,清晰明了
        }
        for (j = 0; j < len; j++)
        {
            if (arr[j] >= 10)
            {
                arr[j + 1] += arr[j] / 10;
                arr[j] %= 10;  //更新arr[j]的值
            }

            while (arr[len])  //若阶乘数组位数产生了进位,如从3(一位数)到12(两位数)
            {   
                arr[len + 1]+=arr[len] / 10;
                arr[len] %= 10;
                len++;  //数组位数增加一位
            }
        }

        //阶乘累加
        length1 = len;  // lenth1表示结果数组位数
        for (k = 0; k < len; k++)
        {
            sum[k] += arr[k];   //每一位相加

            if (sum[k] >= 10)
            {
                sum[k + 1] += sum[k] / 10;
                sum[k] %= 10;
            }

            while (sum[length1])  //若结果数组位数产生了进位
            {
                sum[length1 + 1] += sum[length1] / 10;
                sum[length1] %= 10;
                length1++;
            }
        }
    }
    for (i = length1 - 1; i >= 0; i--)
    {
        printf("%d", sum[i]);
    }
    return 0;
}

;