【1173】阶乘和

【题目描述】
       用高精度计算出S=1!+2!+3!+…+n!(n≤50),其中“!”表示阶乘,例如:5!=5×4×3×2×1。。
【输入】
       一个正整数n。
【输出】
       计算结果S。
【输入样例】
       5
【输出样例】
       153
【参考程序】

#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;

int n; 
int len = 1;								// len存储阶乘的 长度 
int sumlen = 1;								// sumlen存储 阶乘和的长度 
int t[40001];								// 数组t存储 阶乘 
int sum[40001];								// 数组sum存 阶乘和 

void fac(int x) {							// 计算x的阶乘(factorial) 
	for (int i=1; i<=len; i++) {
		t[i] *= x;							// 每个位数乘以x 
	}
	int i = 1;
	while (t[i]>9 || i<len)	{				// 判断是否需要进位 
		t[i+1] += t[i] / 10;				// 进位
		t[i] %= 10;							// 只保留个位
		i++;								// 继续对下一位进行处理 
	} 
	len = i; 
}

void add() {
	for (int i=1; i<=len; i++) {
		sum[i] += t[i];						// 对每一位都相加
		if (sum[i] > 9) {
			sum[i+1] += sum[i] / 10;		// 进位
			sum[i] %= 10;					// 只保留个位
			sumlen = max(sumlen, i+1); 
		}
		sumlen = max(sumlen, i);			// 判断当前数的位置,避免了多余的计算 
	}
}

int main() {
	cin >> n;
	t[len] = 1; 
	
	for (int i=1; i<=n; i++) {				// 计算阶乘和 
		fac(i);								// 计算i的阶乘 		
		add();								// 计算1..n阶乘和 
	} 
		
	for (int i=sumlen; i>=1; i--) {
		cout << sum[i];
	} 
	return 0;
}	

发布了49 篇原创文章 · 获赞 0 · 访问量 1035

猜你喜欢

转载自blog.csdn.net/developer_zhb/article/details/105022378