Bigint operator + ( Bigint b ) { if( sign != b.sign ) return (*this) - b.inverseSign(); Bigint c; for(int i = 0, carry = 0; i<a.size() || i<b.size() || carry; i++ ) { carry+=(i<a.size() ? a[i]-48 : 0)+(i<b.a.size() ? b.a[i]-48 : 0); c.a += (carry % 10 + 48); carry /= 10; } return c.normalize(sign); }
Bigint operator - ( Bigint b ) { if( sign != b.sign ) return (*this) + b.inverseSign(); if( (*this) < b ) return (b - (*this)).inverseSign(); Bigint c; for( int i = 0, borrow = 0; i < (int)a.size(); i++ ) { borrow = a[i] - borrow - (i < b.size() ? b.a[i] : 48); c.a += borrow >= 0 ? borrow + 48 : borrow + 58; borrow = borrow >= 0 ? 0 : 1; } return c.normalize(sign); }
Bigint operator - ( Bigint b ) { // subtraction operator overloading if( sign != b.sign ) return (*this) + b.inverseSign(); int s = sign; sign = b.sign = 1; if( (*this) < b ) return ((b - (*this)).inverseSign()).normalize(-s); Bigint c; for( int i = 0, borrow = 0; i < a.size(); i++ ) { borrow = a[i] - borrow - (i < b.size() ? b.a[i] : 48); c.a += borrow >= 0 ? borrow + 48 : borrow + 58; borrow = borrow >= 0 ? 0 : 1; } return c.normalize(s); }
Bigint operator * ( Bigint b ) { int MAXN=a.size()+b.size()+5; int tmp[MAXN]; memset(tmp,0,sizeof(tmp)); for(int i=0; i<a.size(); i++) for(int j=0, p=i; j<b.size(); j++){ tmp[p++] += (a[i]-'0')*(b.a[j]-'0'); } Bigint c; for(int i=0; i<MAXN-1; i++){ tmp[i+1] += tmp[i]/10; tmp[i] %= 10; c.a.push_back(tmp[i]+'0'); } return c.normalize(sign*b.sign); }