洛谷题单算法1-1模拟与高精度 P1009 阶乘之和

本文介绍了一种使用高精度计算方法来求解S=1!+2!+...+n!(n≤50)的C语言实现方案。通过定义数组记录每次阶乘和累加过程中的每一位数,避免了传统整型数据溢出的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

用高精度计算出S=1!+2!+3!+…+n!(n≤50)

其中“!”表示阶乘,例如:5!=5×4×3×2×1
输入格式

一个正整数N。
输出格式

一个正整数S,表示计算结果。
输入输出样例
输入 #1
3

输出 #1
9

#include<stdio.h>
int sum[1000]={0};//记录总和,即为所求
int a[1000]={0};//记录每次乘法后每位个位数 
int ans=1;//记录加法位数 
void fac(int n){//传入一个整数,计算这个整数的阶乘,然后再把阶乘结果与之前计算的和累加在一起。
	int i,m;
	int ans1=1;//记录乘法结果位数 
	a[1]=1;//从1开始 
	for(i=1;i<=n;i++){//阶乘开始 i从1逐渐增大到n 
		int carry=0,j;//carry记录进位,初始进位为0 
		for(j=1;j<=ans1;j++){
			m=a[j]*i+carry;//从个位逐位乘,再加上低位传来的进位 
			a[j]=m%10; //将结果的余数留在低位
			carry=m/10;//结果的商进位
		}
		while(carry!=0){//进位可能不止是1 
			a[j]=carry%10;
			carry/=10;
			j++;
			ans1++;//位数增加 
		}
	}
	//以上计算的是n的阶乘,以下开始累加
	int carry=0,temp;//进位,暂存结果
	for(i=1;i<=ans1||i<=ans;i++){/*加法(i是加法位数,如果n的阶乘结果位数
	小于之前累加和的位数,则只需要加到阶乘结果最高位即可,反之,则多余的数值
	都会放在进位中,所以只需要进行较少位数即可)*/
		 temp=a[i]+sum[i]+carry;
		 sum[i]=temp%10;
		 carry=temp/10;
	}
	if(carry!=0){
		sum[i]=carry;
		ans++;
	}
}
int main(){
	int i,n,k;
	scanf("%d",&n);
	for(i=1;i<=n;i++){
		fac(i);//进行n次阶乘的运算
	}
 	for (k = 1000; k > 0; k--) {
  		if (sum[k] != 0)break;//去除多余的零
	}
 	for (; k>= 1; k--) {
  		printf("%d", sum[k]);//倒序输出
 	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值