/* C语言高精度运算-阶乘累加 1!+2!+3!+...+n! */
# include <stdio.h>
# define N 10000 // 数组长度
int main(){
int i, j, k, n, s[N] = { 1 }, a[N] = { 1 }, digit = 1; // s阶乘累加值, a当前阶乘值, digit代表的是数字的位数
printf("Please enter a natural number n not exceeding 3248:\n"); // 10000长度的数组,最多能计算∑3248!
scanf("%d", &n);
// 如果n>1,从2的阶乘开始累加; // 如果是0或1,阶乘和就是1,不用该循环计算,直接输出已初始化的s
for (k = 2; k <= n; k++){
// 阶乘
for (j = 0; j<digit; j++)
a[j] *= k; // a各个位置的数值乘k
for (j = 0; j<digit; j++){ // 判断各个位置的数字是否>=10,若是则增加一位a的位数
if (a[j] >= 10){
a[j + 1] += a[j] / 10;
a[j] = a[j] % 10;
if (j == digit - 1)
digit++;
}
}
// 累加
for (i = 0; i<digit; i++)
s[i] += a[i]; // s和a各个位置的数字对应相加
for (i = 0; i<digit; i++){ // 判断各个位置的数字是否>=10,若是则增加一位s的位数
if (s[i] >= 10){
s[i + 1] += s[i] / 10;
s[i] = s[i] % 10;
if (i == digit - 1)
digit++;
}
}
}
// 倒序输出 a = n!
printf("%d!=", n);
for (i = digit - 1; i >= 0; i--){
printf("%d", a[i]);
}
printf("\n");
// 倒序输出 s = ∑n!
printf("∑%d!=", n);
for (i = digit - 1; i >= 0; i--){
printf("%d", s[i]);
}
printf("\n");
return 0;
}
下面分别给出1!+2!+3!+...+20! 、 1!+2!+3!+...+50! 、 1!+2!+3!+...+100!的运行结果示例:
参考1: 求1!+2!+3!+...+20!的C语言,
求1!+2!+3!+....+20!的c语言 - c程序设计课后答案,该文使用double类型来计算,只能精确到16位有效数字。