题目中N的范围比较大,考虑到大整数类运算比较复杂,考虑使用10000进制

做法:开个大数组,数组的每一位作为10000进制数的每一位,缝10000进1

代码如下:

#include <bits/stdc++.h>
using namespace std;

void fac(int n){    //10000进制数组
    static int a[10002];
    int digital = 1,carry = 0;
    a[1] = 1;
    if(!n) printf("1");
    else{
        for(int i = 1;i <= n;i++){
            carry = 0;
            for(int j = 1;j <= digital;j++){
                a[j] = a[j]*i + carry;
                carry = a[j]/10000;
                a[j] %= 10000;
            }
            if(carry) a[++digital] = carry;
        }
        cout<<a[digital];
        for(int k = digital - 1; k > 0;k--)
            printf("%04d",a[k]);
    }
    printf("\n");
}


int main(){
    //std::ios::sync_with_stdio(false);
    //std::cin.tie(0);
    int n = 1;
    while(scanf("%d",&n) == 1){
        fac(n);
    }
    return 0;
}