my::LongInt my::operator -(my::LongInt const &_a, my::LongInt const &_b) { if (_a.sign == _b.sign){ LongInt result; LongInt a, b; unsigned int digit = Pow(2, CHAR_BIT); unsigned int help; if (_a < _b){ //получаем знак разности и после работаем с числами a и b, причем 0 <= b <= a result.sign = false; if (abs(_a) < abs(_b)){ a = abs(_b); b = abs(_a); } else{ b = abs(_b); a = abs(_a); } } else{ result.sign = true; if (abs(_a) < abs(_b)){ a = abs(_b); b = abs(_a); } else{ b = abs(_b); a = abs(_a); } } result.number = a.number; for(unsigned int i = 0; i < b.number.GetSize(); i++){ if (a.number[i] >= b.number[i]) result.number[i] -= b.number[i]; else{ help = a.number[i] + digit - b.number[i]; result.number[i] = (char) help; int j = i + 1; for (; a.number[j] == 0; j++){ a.number[j] = digit - 1; result.number[j] = digit - 1; } a.number[j]--; result.number[j]--; } } result.DelZero(); return result; } else{ LongInt b(_b); b.sign = !b.sign; return _a + b; } }
my::LongInt my::operator /(my::LongInt const &_a, unsigned char const b) { unsigned int digit = Pow(2, CHAR_BIT); LongInt retVal; unsigned int r = 0; unsigned int help; for (int i = _a.number.GetSize() - 1; i >= 0; i--){ help = _a.number[i] + r * digit; retVal.number[i] = help / b; r = help % b; } retVal.DelZero(); return retVal; }