classBigInt { public: int len_; int arr_[LEN]; int &operator[](int idx) { return arr_[idx]; } BigInt(int x = 0) { memset(arr_, 0, sizeof(arr_)); for (len_ = 1; x; ++len_) { arr_[len_] = x % 10; x /= 10; } --len_; } voidflatten(int len) { len_ = len; for (int i = 1; i <= len_; ++i) { if (arr_[i] >= 10) { arr_[i + 1] += arr_[i] / 10; arr_[i] %= 10; } } while (!arr_[len_]) --len_; } voidprint() { for (int i = max(1, len_); i >= 1; --i) { cout << arr_[i]; } } };
BigInt operator+(BigInt a, BigInt b) { BigInt c; int len = max(a.len_, b.len_); for (int i = 1; i <= len; ++i) { c[i] += a[i] + b[i]; } c.flatten(len + 1); return c; }
BigInt operator*(BigInt a, int b) { BigInt c; int len = a.len_; for (int i = 1; i <= len; ++i) { c[i] += a[i] * b; } c.flatten(len + 11); return c; }
intmain() { int n; cin >> n; BigInt a, b(1); for (int i = 1; i <= n; ++i) { b = b * i; a = a + b; } a.print(); return0; }
思路
标准的模板题,没有坑点;只不过高精度乘高精度可以简化成下面的高精度乘低精度,一次循环即可
因为int类型最大也就是10位,在这里len + 11可以满足两数相乘的结果位数
1 2 3 4 5 6 7 8 9 10 11
BigInt operator*(BigInt a, int b) { BigInt c; int len = a.len_; for (int i = 1; i <= len; ++i) { c[i] += a[i] * b; } c.flatten(len + 11); return c; }