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

题目描述

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

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

一个正整数N。
输出格式

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

输出 #1
9

#include
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;
}

你可能感兴趣的:(洛谷题单算法1-1模拟与高精度)