参考链接:
大数阶乘(N!)问题
https://www.jianshu.com/p/39eaa57f9b38
解题思路:将正整数N从1到N逐位相乘,即1 * 2 * 3...... * (N-1) * N。每次相乘后的值会存储到array[ ]中,其中一个数组元素中存储值中的一位数。当值小于10时直接存储,值大于10时,计算进位和本位,array[ j ]存储本位,array[ j+1 ]存储进位。

#include <iostream>
#include <cstdio>
using namespace std;
#define _for(i, a, b) for(int i = a; i <= b; i++)
#define _rre(i, a, b) for(int i = a; i >= b; i--)
const int maxn = 100000;
int main(){
    int N;//正整数N
    while(~scanf("%d", &N)){
        int a[maxn] = {0};
        int carry = 0;//carry表示进位数,刚开始进位为0
        int point = 1;//point代表位数,刚开始只有一位a[1]
        int j = 0;
        a[1] = 1;//从a[1]开始
        _for(i, 2, N){//N的阶乘
            //循环a[],让每一位都与i乘
            for(j = 1; j <= point; j++){
                int tmp = i * a[j] + carry;// temp变量表示不考虑进位的值
                carry  = tmp / 10;// 计算进位大小
                a[j] = tmp % 10;// 计算本位值
            }
            // 处理最后一位的进位情况
            // 由于计算数组的最后一位也得考虑进位情况,所以用循环讨论
            // 因为可能最后一位可以进多位;比如 12 * 本位数8,可以进两位
            // 当进位数存在时,循环的作用就是将一个数分割,分割的每一位放入数组中
            while(carry){
                a[j] = carry % 10;
                carry /= 10;
                j++;
            }
            point = j - 1;// 由于上面while中循环有j++,所以位会多出一位,这里减去
        }
        _rre(i, point, 1){//逆序打印结果
            printf("%d", a[i]);
        }
        printf("\n");
    }
    return 0;
}