C语言高精度运算-阶乘累加:1!+2!+3!+...+n!

/* 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位有效数字。
参考2: 高精度运算-阶乘累积求和, 高精度运算-阶乘累积求和 - 随风浪子的博客 - 博客园,该文使用数组来进行高精度运算。

PS:个人学习参考后整理的,仅供参考。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值