P1009 阶乘之和

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

输入输出格式
输入格式:
一个正整数NN。

输出格式:
一个正整数SS,表示计算结果。

输入输出样例
输入样例#1:
3
输出样例#1:
9

这题我用了vector,
这相比于我以前,少了一个统计计算首位在哪个位置

#include <bits/stdc++.h>
using namespace std;
vector<int>a;
vector<int>t;
int fun(int n)
{
	vector<int>b;
	int f = 0;
	for(int i = a.size()-1;i >= 0;i--){
		b.push_back((n*a[i]+f)%10);
		f = (n*a[i]+f)/10;
	}
	while(f){
		b.push_back(f%10);
		f /= 10;
	}
	a.clear();
	for(int i = b.size()-1;i >= 0;i--){
		a.push_back(b[i]);
	}
	return 0;
}
int swap()
{
	int i = a.size()-1;
	int j = t.size()-1;
	vector<int>c;
	int f = 0;
	while(i >= 0 || j >= 0){
		if(i >= 0 && j>= 0){
			c.push_back((a[i]+t[j]+f)%10);
			f = (a[i]+t[j]+f)/10;
		}else if(i >= 0){
			c.push_back((a[i]+f)%10);
			f = (a[i]+f)/10;
		}else if(j >= 0){
			c.push_back((t[j]+f)%10);
			f = (t[j]+f)/10;
		}
		i--;
		j--;
	}
	t.clear();
	for(int i = c.size()-1;i >= 0;i--){
		t.push_back(c[i]);
	}
}
int main()
{
	int n;
	a.push_back(1);
	t.push_back(0);
	scanf("%d",&n);
	for(int i = 1;i <= n;i++){
		fun(i);
		swap();
	}
	/*
	for(int i = 0;i < a.size();i++){
		cout<<a[i];
	}
	*/
	for(int i = 0;i < t.size();i++){
		cout<<t[i];
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_42868863/article/details/88569159