使用一维数组保存阶乘的结果,数组的一个元素,保存阶乘结果的一位数字。
两数相乘实质是数字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;
}