用C++实现:题目描述 用高精度计算出S=1!+2!+3!+…+n!(n≤50) 其中“!”表示阶乘,例如:5!=5*4*3*2*1。 输入 一行,一个正整数N。 输出 一行,一个正整数,即结果S。
时间: 2024-02-12 11:05:04 浏览: 125
计算 S=1!+2!+3!+...+N!。
以下是用C++实现的代码:
```cpp
#include <iostream>
#include <vector>
using namespace std;
// 高精度乘法
vector<int> multiply(vector<int>& a, int b) {
vector<int> c;
int t = 0;
for (int i = 0; i < a.size() || t; i++) {
if (i < a.size()) t += a[i] * b;
c.push_back(t % 10);
t /= 10;
}
return c;
}
// 高精度加法
void add(vector<int>& a, vector<int>& b) {
int t = 0;
for (int i = 0; i < max(a.size(), b.size()) || t; i++) {
if (i < a.size()) t += a[i];
if (i < b.size()) t += b[i];
if (i < a.size()) a[i] = t % 10;
else a.push_back(t % 10);
t /= 10;
}
}
// 高精度阶乘
vector<int> factorial(int n) {
vector<int> a;
a.push_back(1);
for (int i = 1; i <= n; i++) {
a = multiply(a, i);
}
return a;
}
// 高精度求和
vector<int> sum(vector<vector<int>>& nums) {
vector<int> res;
for (int i = 0; i < nums.size(); i++) {
add(res, nums[i]);
}
return res;
}
int main() {
int n;
cin >> n;
vector<vector<int>> nums;
for (int i = 1; i <= n; i++) {
nums.push_back(factorial(i));
}
vector<int> res = sum(nums);
// 输出结果
for (int i = res.size() - 1; i >= 0; i--) {
cout << res[i];
}
cout << endl;
return 0;
}
```
首先读入一个正整数n,然后依次计算1!、2!、3!、...、n!的值,并将它们存储在一个二维数组nums中。其中,nums[i]表示i!的值,存储为一个vector<int>类型的数组。
计算阶乘时,我们使用了高精度乘法的方法。具体来说,我们用一个vector<int>类型的数组a来表示当前的阶乘值,然后依次乘以1、2、3、...、n,每次将乘积存储在a中。在这个过程中,我们需要注意进位的处理。
计算完所有阶乘后,我们将它们相加,得到最终的结果。在相加过程中,我们使用了高精度加法的方法。
最后,我们将最终的结果输出。需要注意的是,在输出结果时,我们需要逆序输出结果的每一位。
阅读全文