【正经题解】高精度求阶乘
2024-02-21 17:57:13
发布于:浙江
16阅读
0回复
0点赞
初始化结果为 ,表示阶乘的和。
从 到 ,依次计算每个数的阶乘。
使用高精度的乘法计算,将当前结果与当前数相乘。
使用高精度的加法计算,将上一步得到的乘积加到总和中。
最终得到的总和即为 ! ! ! ... !。
#include<bits/stdc++.h>
using namespace std;
// 高精度相乘函数
string multiply(string s1, string s2) {
int a[10010] = {}, b[10010] = {}, c[10010] = {};
int l1 = s1.size(), l2 = s2.size();
// 将字符串转为数组表示
for (int i = 0; i < l1; i++)
a[l1 - i - 1] = s1[i] - '0';
for (int i = 0; i < l2; i++)
b[l2 - i - 1] = s2[i] - '0';
// 高精度相乘
for (int i = 0; i < l1; i++) {
for (int j = 0; j < l2; j++) {
c[i + j] += a[i] * b[j];
c[i + j + 1] += c[i + j] / 10;
c[i + j] %= 10;
}
}
int l = 0;
for (int i = l1 + l2; i >= 0; i--) {
if (c[i]) {
l = i;
break;
}
}
// 将数组转为字符串表示
stringstream str__;
for (int i = l; ~i; i--)
str__ << c[i];
return str__.str();
}
// 高精度相加函数
string add(string as, string bs, int n) {
char t[37];
int a[10010] = {}, b[10010] = {}, c[10010] = {};
for (int i = 0; i < 37; i++)
t[i] = i > 9 ? i - 10 + 'A' : i + '0';
// 将字符串转为数组表示
for (int i = 0; i < as.size(); i++)
a[as.size() - 1 - i] = isdigit(as[i]) ? as[i] - '0' : as[i] - 'A' + 10;
for (int i = 0; i < bs.size(); i++)
b[bs.size() - 1 - i] = isdigit(bs[i]) ? bs[i] - '0' : bs[i] - 'A' + 10;
int l = max(as.size(), bs.size());
// 高精度相加
for (int i = 0; i < l; i++) {
c[i] += a[i] + b[i];
c[i + 1] += c[i] / n;
c[i] %= n;
}
c[l] ? l++ : l = l + 0;
// 将数组转为字符串表示
stringstream str;
for (int i = l - 1; ~i; i--)
str << t[c[i]];
return str.str();
}
int main() {
int n = 0;
cin >> n;
string last = "1", sum = "0";
for (int j = 1; j <= n; j++) {
last = "1";
for (int i = 1; i <= j; i++) {
stringstream str____;
str____.str("");
str____ << i;
last = multiply(last, str____.str());
}
sum = add(sum, last, 10);
}
cout << sum;
}
这里空空如也
有帮助,赞一个