阶乘和 (高精度运算)

描述

用高精度计算出S=1!+2!+3!+…+n!(n≤50),其中“!”表示阶乘,例如:5!=5×4×3×2×1。

输入正整数n,输出计算结果S。

格式

输入格式

一个正整数n。

输出格式

计算结果S。

样例

输入样例

5

输出样例

153

限制

时间限制:1000 ms

内存限制:65536 KB

题目其实很简单的,这个题可以拆分为两个题,一个是高精度运算求阶乘,另一个是高精度运算求和。

对于高精度运算,一般都是用数组要储存数据。

#include<bits/stdc++.h>
using namespace std;

const int maxn = 50005;
int ans[maxn], tmp[maxn];

void multiply(int j){                        //求阶乘
	for (int i=1; i<=j; i++) {
		int tmpa = 0;
		for (int k=0; k<maxn; k++) {
			tmp[k] = tmp[k]*i + tmpa;
			tmpa = tmp[k] / 10;
			tmp[k] = tmp[k] % 10;
		}
	}
}

void add(){                                //求和
	int tmpb=0;
	for (int i=0; i<maxn; i++) {
		tmpb += ans[i] + tmp[i];
		int cur = tmpb % 10;
		tmpb = tmpb / 10;
		ans[i] = cur;
	}
}

int main()
{
	int n, m;
	scanf ("%d", &n);
	memset(ans, 0, sizeof(ans));
	for (int i=1; i<=n; i++) {
		memset(tmp, 0, sizeof(tmp));
		tmp[0] = 1;
		multiply(i);
		add();
	}
	for (int i=maxn-1; i>=0; i--) {
		if (ans[i]) {
			m = i;
			break;
		}
	}
	for (int i=m; i>=0; i--) {
		printf ("%d", ans[i]);
	}
        return 0;
}

 


版权声明:本文为wodemaoheise原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。