[NOIP1998 普及组] 阶乘之和
题目描述
用高精度计算出 。
其中 ! 表示阶乘,定义为 。
输入格式
一个正整数 n。
输出格式
一个正整数 S,表示计算结果。
样例 #1
样例输入 #1
3
样例输出 #1
9
提示
【数据范围】
对于 100 % 的数据,。
思路:所谓高精度就是用数组来存储数字,数组的每一位代表着数字的每一位,我们需要自己编写函数实现数字的加减乘除等运算以此实现大整数的运算,具体代码实现如下
#include<iostream>
#include<vector>
using namespace std;
void multiply(vector<int>& num, int n)
{
int c = 0;
for (int i = 0; i < num.size(); i++)
{
num[i] = num[i] * n + c;
if (num[i] >= 10)
{
c = num[i] / 10;
num[i] %= 10;
}
else
{
c = 0;
}
}
while (c != 0)
{
num.push_back(c % 10);
c /= 10;
}
return;
}
vector<int> add(vector<int> a, vector<int> b)
{
vector<int>r;
int i = 0, c = 0;
for (; i < a.size() && i < b.size(); i++)
{
r.push_back(a[i] + b[i]);
}
while (i < a.size())
{
r.push_back(a[i]);
i++;
}
while (i < b.size())
{
r.push_back(b[i]);
i++;
}
for (int j = 0; j < r.size(); j++)
{
r[j] += c;
if (r[j] > 9)
{
r[j] %= 10;
c = 1;
}
else
{
c = 0;
}
}
if (c == 1)
{
r.push_back(1);
}
return r;
}
int main()
{
int n;
cin >> n;
vector<int>res;
vector<int>num;
res.push_back(0);
num.push_back(1);
for (int i = 1; i <= n; i++)
{
multiply(num, i);
res = add(res, num);
}
for (int i = res.size() - 1; i >= 0; i--)
{
cout << res[i];
}
return 0;
}