高精度阶层(高精度计算小试牛刀)

Description

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

Input

只有一行,一个正整数n。

Output

只有一行,一个正整数S。

Sample Input

48

Sample Output

12678163798554051767172643373255731925167694226950680420940313

解题思路:

典型的用高精度来计算,而且无需输入需要四则运算的数字,这样便不需要字符串来存储数字并转换成数组,这使问题处理起来方便了不少。一开始我考虑的是先把每个阶层求出来,再两两相加,显然这样做非常麻烦,得先存储所有的阶层值,这会占据更多的时间和内存。所以计算的时候,把求阶层和求和放在一个循环里,求完一个阶层,就加入和中,这样可以使程序更加高效。

AC代码:

#include 
#include 
#include
#define MAX_NUM 20
using namespace std;

int main()
{
    int n, num[MAX_NUM], result[MAX_NUM], ans ;
    scanf("%d",&n);
    memset(num, 0, sizeof(num));
    memset(result, 0, sizeof(result));
    num[0] = 1;
    result[0] = 1;
    int k = 1;
    for(int i = 2; i <= n; i++)
    {
        ans = 0;  //  进位值
        for(int j = 0; j < k; j++)
        {
            num[j] = num[j] * i + ans;    //先乘再加前面的进位
            ans = num[j] / 10000;
            num[j] %= 10000;
            if(ans != 0 && j + 1 == k)    //判断进位后是否已是最大位,如果是便跳出循环
            {
                num[k++] = ans;    //最大位赋上进位值
                break;
            }
        }
        for(int j = 0; j< k ;j++)
        {
            result[j] += num[j];         //结果加上该阶层的值
            result[j+1] += result[j] / 10000;  
            result[j] %= 10000;
        }
    }
    bool isBegin = false;
    for(int i = MAX_NUM - 1; i >= 0; i--)
    {
        if(isBegin)
            printf("%04d",result[i]);
        else if(result[i])
        {
            printf("%d",result[i]);
            isBegin = true;
        }
    }
    return 0;
}


你可能感兴趣的:(===高精度===,解题报告)