用高精度计算出 S=1!+2!+3!+?+n!(n*≤50)。
其中“!”表示阶乘,例如:15!=5×4×3×2×1。
一个正整数 n。
一个正整数 S,表示计算结果。
输入 #1
3
输出 #1
9
【数据范围】
对于 100% 的数据,1≤n≤50。
思路就是高精乘+高精加,就是把高精乘的模板套上去接着套高精加的模板,b=c=i的阶乘。
#include<bits/stdc++.h> //万能头文件
using namespace std;
int a[100], b[100], i, j, c[100];
int f[100];
int len_a;
int len_b = 1;
int len_c = 1;
int m = 1;
int main () {
int n;
cin>>n;
b[1] = 1;
for (int x = 1; x <= n; x++) {
len_a = 0;
int p = x;
while (p > 0) {
a[++len_a] = p % 10;
p /= 10;
}
for (i = 1; i <= len_a; i++) {
for (j = 1; j <= len_b; j++) {
c[i + j - 1] += a[i] * b[j];
}
}
len_c = len_a + len_b;
len_b = len_c;
m = max(m, len_c);
for (i = 1; i < len_c; i++) {
if (c[i] > 9) {
c[i + 1] += c[i] / 10;
c[i] %= 10;
}
}
for (int k = 1; k <= len_c; k++) {
b[k] = c[k];
}
memset(c, 0, sizeof (c));
for (int j = 1; j < m; j++) {
f[j] += b[j];
if (f[j] > 9) {
f[j + 1] += f[j] / 10;
f[j] %= 10;
}
}
}
while(!f[m] && m > 0) {
m--; //去掉首导零
}
for(i = m;i>= 1;i--) {
cout<<f[i]; //倒序输出
}
return 0; //圆满结束
}
原文:https://www.cnblogs.com/mrmrwjk/p/14731702.html