| 56 | intx res(*this); res.sign *= -1; return res; } |
| 57 | friend intx abs(const intx &n) { return n < 0 ? -n : n; } |
| 58 | intx operator +(const intx& b) const { |
| 59 | if (sign > 0 && b.sign < 0) return *this - (-b); |
| 60 | if (sign < 0 && b.sign > 0) return b - (-*this); |
| 61 | if (sign < 0 && b.sign < 0) return -((-*this) + (-b)); |
| 62 | intx c; c.data.clear(); |
| 63 | unsigned long long carry = 0; |
| 64 | for (int i = 0; i < size() || i < b.size() || carry; i++) { |
| 65 | carry += (i < size() ? data[i] : 0ULL) + |
| 66 | (i < b.size() ? b.data[i] : 0ULL); |
| 67 | c.data.push_back(carry % intx::radix); |
| 68 | carry /= intx::radix; } |
| 69 | return c.normalize(sign); } |
| 70 | intx operator -(const intx& b) const { |
| 71 | if (sign > 0 && b.sign < 0) return *this + (-b); |
| 72 | if (sign < 0 && b.sign > 0) return -(-*this + b); |