//------------------------------------------------------------- BigInteger BigInteger::operator + (BigInteger b) { BigInteger addition; if( getSign() == b.getSign() ) // both +ve or -ve { addition.setNumber( add(getNumber(), b.getNumber() ) ); addition.setSign( getSign() ); } else // sign different { if( absolute() > b.absolute() ) { addition.setNumber( subtract(getNumber(), b.getNumber() ) ); addition.setSign( getSign() ); } else { addition.setNumber( subtract(b.getNumber(), getNumber() ) ); addition.setSign( b.getSign() ); } } if(addition.getNumber() == "0") // avoid (-0) problem addition.setSign(false); return addition; }
//------------------------------------------------------------- bool BigInteger::less(BigInteger n1, BigInteger n2) { bool sign1 = n1.getSign(); bool sign2 = n2.getSign(); if(sign1 && ! sign2) // if n1 is -ve and n2 is +ve return true; else if(! sign1 && sign2) return false; else if(! sign1) // both +ve { if(n1.getNumber().length() < n2.getNumber().length() ) return true; if(n1.getNumber().length() > n2.getNumber().length() ) return false; return n1.getNumber() < n2.getNumber(); } else // both -ve { if(n1.getNumber().length() > n2.getNumber().length()) return true; if(n1.getNumber().length() < n2.getNumber().length()) return false; return n1.getNumber().compare( n2.getNumber() ) > 0; // greater with -ve sign is LESS } }
BigInteger BigInteger::operator * (BigInteger b) { BigInteger mul; mul.setNumber( multiply(getNumber(), b.getNumber() ) ); mul.setSign( getSign() != b.getSign() ); if(mul.getNumber() == "0") // avoid (-0) problem mul.setSign(false); return mul; }
// Warning: Denomerator must be within "long long" size not "BigInteger" BigInteger BigInteger::operator / (BigInteger b) { long long den = toInt( b.getNumber() ); BigInteger div; div.setNumber( divide(getNumber(), den).first ); div.setSign( getSign() != b.getSign() ); if(div.getNumber() == "0") // avoid (-0) problem div.setSign(false); return div; }
// Warning: Denomerator must be within "long long" size not "BigInteger" BigInteger BigInteger::operator % (BigInteger b) { long long den = toInt( b.getNumber() ); BigInteger rem; long long rem_int = divide(number, den).second; rem.setNumber( toString(rem_int) ); rem.setSign( getSign() != b.getSign() ); if(rem.getNumber() == "0") // avoid (-0) problem rem.setSign(false); return rem; }
void test5() { cout << "Sign ... "; for (int t = 0; t < 100; t++) { int len = rand() % 1000 + 1; genBigIntAsString(s, len); BigInt a = biFromString(s); aa = stringToBigInteger(s); assert(biSign(a) == aa.getSign()); biDelete(a); } cout << " OK\n"; }
//------------------------------------------------------------- void BigInteger::operator = (BigInteger b) { setNumber( b.getNumber() ); setSign( b.getSign() ); }
bool BigInteger::equals(BigInteger n1, BigInteger n2) { return n1.getNumber() == n2.getNumber() && n1.getSign() == n2.getSign(); }
//------------------------------------------------------------- BigInteger BigInteger::operator - (BigInteger b) { b.setSign( ! b.getSign() ); // x - y = x + (-y) return (*this) + b; }
std::string bigIntegerToString(const BigInteger &x) { return (x.getSign() == BigInteger::negative) ? (std::string("-") + bigUnsignedToString(x.getMagnitude())) : (bigUnsignedToString(x.getMagnitude())); }