我是直接用书里的高精加和高精乘打上去自己又团成一块的,但是不知道为什么到9的时候就溢出(?)了,往后也都是405853
,但是我觉得我数组已经开的够大的了。。 来自蒟蒻的求助,请各位dalao解答。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int a[101], b[101], c[10001], ans[10001];
long long lena, lenb, lenc, lenans = 1, x;
int main() {
int n;
scanf("%d", &n);
b[1] = 1, lenc = 1, lenb = 1, lena = 1;
for (int i = 1; i <= n; i++) {
x = 0;
int tmp = i, cnt = 0;
while (tmp) {
if (i > 10) lena = 2;
else lena = 1;
a[lena - cnt] = tmp % 10;
tmp /= 10, cnt++;
}
// for (int j = lena; j >= 1; j--) printf("%d", a[j]);
// printf("\n");
for (int j = 1; j <= lena; j++) {
x = 0;
for (int k = 1; k <= lenb; k++) {
c[j + k - 1] = a[j] * b[k] + x + c[j + k - 1];
x = c[j + k - 1] / 10;
c[j + k - 1] %= 10;
// cout<<"C: "<<c[j + k - 1]<<endl;
}
c[j + lenb] = x;
}
lenc = lena + lenb, x = 0;
// cout<<"C After: ";
// for (int j = lenc; j >= 1; j--) printf("%d", c[j]);
// printf("\n");
for (int j = 1; j <= lenc; j++) b[j] = c[j];
lenb = lenc;
memset(c, 0, sizeof(c));
while (ans[lenans] == 0 && lenans > 1) lenans--;
while (lenans <= lenb) {
ans[lenans] = ans[lenans] + b[lenans] + x;
x = ans[lenans] / 10;
ans[lenans] %= 10, lenans++;
}
x ? ans[lenans] = x : lenans--;
}
while (ans[lenans] == 0 && lenans > 1) lenans--;
for (int i = lenans; i >= 1; i--) printf("%d", ans[i]);
printf("\n");
return 0;
}
本蒟蒻将万分感激!!