题目描述
用高精度计算出 S = 1! + 2! + 3! + \cdots + n!S=1!+2!+3!+⋯+n!(n \le 50n≤50)。
其中“!”表示阶乘,例如:5! = 5 \times 4 \times 3 \times 2 \times 15!=5×4×3×2×1。
输入格式
一个正整数 nn。
输出格式
一个正整数 S,表示计算结果。
输入输出样例
输入 #1复制
3
输出 #1复制
9
说明/提示
【数据范围】
对于 100 %100% 的数据,1 \le n \le 501≤n≤50。
解题思路:本题计算数字较大,需要采用高精度计算,用数组来保存阶乘答案和计算答案,本题主要是两个函数比较重要。1.计算阶乘。2.计算和
阶乘函数如下:
#include<iostream>
#include<string>
#include<vector>
#include<queue>
#include<string.h>
#include<stdio.h>
#include<algorithm>
#include<cstdlib>
using namespace std;
vector<int> v(100,0);//最后的结果
int len=0;
int length=1;
void sum(vector<int> &temp)//计算temp和v相加
reverse(v.begin(),v.end());
int x=0;
int k=0;
while(k<length||k<len)
{
//cout<<temp[k]<<" "<<v[k]<<endl;
v[k]=temp[k]+v[k]+x;
x=v[k]/10;
v[k]%=10;
k++;
}
v[k]=x;
if(v[k]==0)
{
k--;
}
len=k;
reverse(v.begin(),v.end());
}
vector<int> jc(int n)//计算阶乘
{
vector<int> a(100,0);
length=1;
a[0]=1;
for(int i=1;i<=n;i++)
{
int p=0;
int carry=0;
while(1)
{
int product=a[p]*i+carry;
a[p]=product%10;
carry=product/10;
p++;
if(a[p]==0&&carry==0&&p>=length) break;
}
length=p;
}
/*for(int i=length-1;i>=0;i--)
{
cout<<a[i];
}*/
return a;
}
void fun(int n)
{
for(int i=1;i<=n;i++)
{
vector<int> temp=jc(i);
sum(temp);
}
}
int main()
{
int n;
cin>>n;
fun(n);
int size=v.size();
for(int i=size-len-1;i<size;i++)
{
cout<<v[i];
}
return 0;
}