void Bigint::internalDivide(const Bigint& number, const bool& isDecimal, const int& precision) { std::string mstring; std::vector<int> mparts; std::string fnvalue = toString(); std::string snvalue = number.toString(); if(fnvalue.length()>snvalue.length()) { if(!number.isPositive) mstring = snvalue.substr(1); else mstring = snvalue; mparts = parts; } else { if(!number.isPositive) mstring = fnvalue.substr(1); else mstring = fnvalue; mparts = number.parts; } if(mstring!="" && mparts.size()>0) { int recurse = 0; std::string build; decompose(fnvalue, snvalue, number, recurse, build, isDecimal, precision); try { create(build); } catch (...) { } } }
void Bigint::multiply(const Bigint& number) { Bigint mulResult; std::string mstring; std::vector<int> mparts; std::string fnvalue = toString(); std::string snvalue = number.toString(); if(fnvalue.length()>snvalue.length()) { if(!number.isPositive) mstring = snvalue.substr(1); else mstring = snvalue; mparts = parts; } else { if(!number.isPositive) mstring = fnvalue.substr(1); else mstring = fnvalue; mparts = number.parts; } if(mstring!="" && mparts.size()>0) { int position = 0; for (int i = mstring.length(); i > 0 ; i--, position++) { std::string numstr = BLANK; int mult = mstring.at(i-1) - '0'; int carryOver = 0; for (int j=0;j<(int)mparts.size();j++) { std::string res = CastUtil::lexical_cast<std::string>(mparts.at(j)*mult); if(j!=(int)mparts.size()-1) { std::string mrtn = CastUtil::lexical_cast<std::string>(mparts.at(j)); if(res.length()>mrtn.length()) { int numm = CastUtil::lexical_cast<int>(res.substr(1)) + carryOver; numstr = CastUtil::lexical_cast<std::string>(numm) + numstr; carryOver = res.at(0) - '0'; } else { int numm = CastUtil::lexical_cast<int>(res) + carryOver; numstr = CastUtil::lexical_cast<std::string>(numm) + numstr; carryOver = 0; } if(j==0) { int nl = numstr.length(); for (int jj = 0; jj < NUM_LENGTH-nl; jj++) { numstr = ZERO + numstr; } } } else { int numm = CastUtil::lexical_cast<int>(res) + carryOver; numstr = CastUtil::lexical_cast<std::string>(numm) + numstr; carryOver = 0; } } for (int j = 0; j < position; j++) { numstr += ZERO; } try { Bigint num(numstr); mulResult.internalAdd(num); } catch (...) { } } } this->parts = mulResult.parts; if(isPositive!=number.isPositive) { isPositive = false; } else if(isPositive==number.isPositive) { isPositive = true; } }