使用一维数组保存阶乘的结果,数组的一个元素,保存阶乘结果的一位数字。

两数相乘实质是数字A的每一位依次乘以数字B,相乘后判断每位数字是否大于等于10,大于等于10则进位。

data[0] 不使用,需要注意的是输出时,从数组的最高位开始输出

#include <stdio.h>

#define SIZE 3000  //1000! 大约有两千位

int BigFact(int n,int data[]){
    int i,j,k,index=1;
    if(n<=1){
        return 0;
    }
    for(i=0;i<SIZE;i++){
        data[i] = 0;
    }
    data[1] = 1;
    
    for(i=1;i<=n;i++){
        // 阶乘运算
        for(j=1;j<=index;j++){
            data[j] *= i;
        }
        // 判断是否需要进位,最高位在下面单独处理
        for(k=1;k<index && index<SIZE; k++){
            if(data[k]>=10){
                data[k+1] += data[k]/10;
                data[k] %= 10;
            }
        }
        // 单独处理最高位
        while(data[index]>=10 && index<SIZE){
            data[index+1] = data[index]/10;
            data[index] %= 10;
            index++;
        }
    }
    // 判断数组的位数是否够用
    if(index<SIZE){
        return index;
    }else{
        printf("overflow!\n");
        return 0;
    }
}

// 从最高位开始打印数组
void PrintFact(int data[],int index){
    int i;
    for(i=index;i>0;i--){
        printf("%d",data[i]);
    }
    printf("\n");
}

// 1000! 大约有两千位
int main(){
    int n;
    int index;
    int data[SIZE];
    while(scanf("%d",&n)!=EOF){
        index = BigFact(n,data);
        if(index!=0)
            PrintFact(data, index);
    }
    
    return 0;
}