BigInt BigInt::operator -(const BigInt& right) const { BigInt left = *this; if (left.sign != right.sign) { return left - (-right); } if (this->abs() >= right.abs()) { BigInt res = left; int carry = 0; for (int i = 0; i < right.number.size() || carry; ++i) { res.number[i] -= carry + (i < right.number.size() ? right.number[i] : 0); carry = res.number[i] < 0; if (carry) { res.number[i] += BigInt::base; } } res.RemoveZero(); return res; } else { return -(right - left); } }
BigInt BigInt::operator *(const BigInt& right) const { BigInt left = *this; BigInt res; res.sign = left.sign * right.sign; res.number.resize(right.number.size() + left.number.size() + 1); for (int i = 0; i < left.number.size(); i++) { for (int j = 0, carry = 0; j < right.number.size() || carry; j++) { long long buf = res.number[i + j] + left.number[i] * 1ll * (j < right.number.size() ? right.number[j] : 0) + carry; res.number[i + j] = (int)(buf % BigInt::base); carry = (int)(buf / BigInt::base); } } res.RemoveZero(); return res; }