예제 #1
0
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);
    }
}
예제 #2
0
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;
}