题目描述
用高精度计算出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;
}