洛谷刷题1:阶乘之和(P1009)

这其实属于高精度问题

如果数字很小的话,这个问题根本不算个问题,但是,如果要算的阶乘是20往上的阶乘,数字将会非常庞大,大大超出int型的-2147483647~2147483647

因此,我们需要用到数组去存每一位

而计算的过程,不能简单地用乘法,而是利用各位小学就学过的内容,竖式计算

所谓竖式计算,形如

   36

   *8

——

 288

其中涉及每一位的计算与进位

而我们的代码也是这个思路

#include<iostream>
using namespace std;
int a[2000];
int c[2000];
void shushichengfa(int a[], int n)//这里我们的竖式乘法是在算出n-1的阶乘的基础上算n的阶乘
{
    int x = 0;
    for (int i = 1; i <= 1000; i++) {
        a[i] = a[i] * n + x;
        x = a[i] / 10;//这里的x就是为了处理进位问题,如果a[i]此时超出了10,那么会将超出的部分加到下一位
        a[i] %= 10;//a[i]保留个位的数字
    }
}
void shushijiafa(int a[], int c[])//竖式加法类似
{
    int x = 0;
    for (int i = 1; i <= 1000; i++)
    {
        c[i] += a[i] + x;
        x = c[i] / 10;
        c[i] %= 10;
    }
}
int main()
{
    int n;
    cin >> n;
    a[1] = 1;//先将第一位初始化
    for (int i = 1; i <= n; i++)
    {
        shushichengfa(a, i);
        shushijiafa(a, c);
    }
    bool flag = 0;
    for (int i = 1000; i >= 1; i--)
    {
        if (c[i] != 0) flag = 1;
        if (flag) cout << c[i];
    }
    return 0;
}

 

posted @ 2021-01-16 21:58  _翩若惊鸿  阅读(201)  评论(0)    收藏  举报