阶乘的结果往往超出程序语言内置的整型数据类型(int、long long)的数据表示范围,造成溢出从而不能正确表示。
一种有效的阶乘表示方法是,将结果的每位数(0~9)表示成数组元素,这样可以预先定义一个较大的数组表示阶乘。
例如,5! = 120,用数组narr[5]表示的如下图:
narr[0] | narr[1] | narr[2] | ||
0 | 2 | 1 |
于是6! = 6 * 5!,将6与narr的每个元素相乘:
narr[0] | narr[1] | narr[2] | ||
0 * 6 = 0 | 2 * 6 = 12 | 1 * 6 = 6 |
然后,将数组narr进行进位处理后的结果为:
narr[0] | narr[1] | narr[2] | ||
0 | 12 % 10 = 2 | 6 + (12 / 10) = 7 |
实例代码:
#include <stdio.h>
#define MAX_LENGTH 100000
int main()
{
int n;
scanf("%d", &n); //输入正整数
int idx, //数组的长度边界
narray[MAX_LENGTH]; //存储阶乘结果的数组
idx = 1;
narray[0] = 1;
for (int i = 1; i <= n; i++) {
int tmp, //临时计算值
carry = 0; //当前位的进位数
for (int j = 1; j <= idx; j++) {
tmp = narray[j-1] * i + carry;
narray[j-1] = tmp % 10; //存储小于10的整数
carry = tmp / 10; //计算进位数
}
//更新进位
while (carry) {
narray[++idx-1] = carry % 10;
carry /= 10;
}
}
//打印计算结果
for (int i = idx; i >= 1; i--) {
printf("%d", narray[i-1]);
}
}