在做程序题过程中,遇到大数阶乘问题,现今来回顾下写的代码。
牛客网:程序地址
int main() {
int n;
int i,j;
int array[10000]={0}; //数组存储很大的数:由后往前存储
int carry=0; //进位
/*
上述何为进位?
例如:我现在得到了 145 这个整数,而我们数组只能存储一位数字,
故我现在 carry = 145/10,那么 carry=14,所以 14 为进位
*/
int count=1; //一共多少位数(即当前数字有多少位)
int sum=0; //计算阶乘过程中的结果(两个数的阶乘,例如:3*4=12)
array[1]=1; //array[0]舍弃
scanf("%d",&n); //输入,计算n的阶乘
for(i=2;i<=n;i++) { //阶乘
//固然下面的代码很难理解,但是多看几遍,手写一遍代码
for(j=1;j<=count;j++) {
sum = array[j]*i + carry;
carry = sum / 10; //进位
array[j] = sum % 10;
}
while(carry) {
array[j] = carry % 10;
carry = carry / 10;
j++;
}
count = j-1; //上面的j++,多加了一位
}
//倒序输出
for(i=count;i>0;i--) { //需要写 count,是阶乘出来的数有多少位
printf("%d",array[i]);
}
}
注意:上述代码晦涩难懂,可以尝试自己手写一遍,会有较深的体会