рдЕрдзрд┐рдХрд╛рдВрд╢ рдЖрдзреБрдирд┐рдХ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ, рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдЕрдм рдЙрди рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕реАрдзреЗ рд╣реЗрд░рдлреЗрд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХрд╣реАрдВ, рдкрд╛рдЗрдерди рдпрд╛ рд╣рд╛рд╕реНрдХреЗрд▓ рдХреА рддрд░рд╣, рд▓рдВрдмреЗ рдкреВрд░реНрдгрд╛рдВрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рднрд╛рд╖рд╛ рдХреЗ рдореВрд▓ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХрд╣реАрдВ, рдЬрд╛рд╡рд╛ рдпрд╛ рд╕реА # рдореЗрдВ, рдЗрд╕реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд░реНрдЧреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╕реА ++ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ, рд▓рдВрдмреА рд╕рдВрдЦреНрдпрд╛ рдЕрднреА рднреА рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕реЗ рдЦреБрдж рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред
рд╡рд░реНрдЧ рд╕рдВрд░рдЪрдирд╛
рдкрд╣рд▓реА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдирдВрдмрд░ рдХреЛ рдХреИрд╕реЗ рд╕реНрдЯреЛрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдореИрдВ рдЗрд╕реЗ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдПрдХ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реВрдВ, рд░рд┐рд╡рд░реНрд╕ рдСрд░реНрдбрд░ рдореЗрдВ (рдпрд╣ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИ), рддреБрд░рдВрдд рд╕рд░рдгреА рдХреЗ рдПрдХ рддрддреНрд╡ рдореЗрдВ 9 рдЕрдВрдХ (рдЬреЛ рдореЗрдореЛрд░реА рдмрдЪрд╛рддрд╛ рд╣реИ):
class big_integer {
рдореЗрд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рд╢реВрдиреНрдп рдХреЗ рджреЛ рддреБрд░рдВрдд рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╣реЛрдВрдЧреЗ - рдПрдХ рдЦрд╛рд▓реА рд╡реЗрдХреНрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдФрд░ рдПрдХ рдПрдХрд▓ рд╢реВрдиреНрдп рдХреЗ рд╕рд╛рде рд╡реЗрдХреНрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВред
рд╕рдВрдЦреНрдпрд╛ рдирд┐рд░реНрдорд╛рдг
рдкрд╣рд▓реА рдЪреАрдЬ рдЬреЛ рдЖрдкрдХреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реАрдЦрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рд╡рд╣ рдПрдХ рдирдВрдмрд░ рдмрдирд╛рдирд╛ рд╣реИред рдЗрд╕реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реЗ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
big_integer::big_integer(std::string str) { if (str.length() == 0) {
рдЕрдЧреНрд░рдгреА рд╢реВрдиреНрдп рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдХреЛрдб рдЕрдкрдорд╛рди рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рд╣реИ:
void big_integer::_remove_leading_zeros() { while (this->_digits.size() > 1 && this->_digits.back() == 0) { this->_digits.pop_back(); }
рд╣рдореЗрдВ рдирд┐рдпрдорд┐рдд рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдмрджрд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:
big_integer::big_integer(signed long long l) { if (l < 0) { this->_is_negative = true; l = -l; } else this->_is_negative = false; do { this->_digits.push_back(l % big_integer::BASE); l /= big_integer::BASE; } while (l != 0); } big_integer::big_integer(unsigned long long l) { this->_is_negative = false; do { this->_digits.push_back(l % big_integer::BASE); l /= big_integer::BASE; } while (l != 0); }
рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рд░реВрдкрд╛рдВрддрд░рдг рдХреЛрдб рдФрд░ рднреА рд╕рд░рд▓ рд╣реИ, рдореИрдВрдиреЗ рдЗрд╕реЗ рдпрд╣рд╛рдВ рдЙрджреНрдзреГрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред
рд╕рдВрдЦреНрдпрд╛ рдЙрддреНрдкрд╛рджрди
рдЕрдм рд╣рдореЗрдВ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рд╣рдо рдЕрдкрдиреЗ рдирдВрдмрд░ рдХреЛ рдПрдХ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдХреИрд╕реЗ рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдмрджрд▓реЗрдВ:
std::ostream& operator <<(std::ostream& os, const big_integer& bi) { if (bi._digits.empty()) os << 0; else { if (bi._is_negative) os << '-'; os << bi._digits.back();
рд╕рдВрдЦреНрдпрд╛ рддреБрд▓рдирд╛
рдЕрдм рд╣рдореЗрдВ рдпрд╣ рд╕реАрдЦрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рджреЛ рдирдВрдмрд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдХреИрд╕реЗ рдХрд░реЗрдВред рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓ рджреЛ рдСрдкрд░реЗрд╢рди рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВ, рдмрд╛рдХреА рдХреЛ рдЙрдирдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рддреЛ, рдкрд╣рд▓реЗ рд╣рдо рд╕реАрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╕рдорд╛рдирддрд╛ рдХреЗ рд▓рд┐рдП рджреЛ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рддреБрд▓рдирд╛ рдХреИрд╕реЗ рдХрд░реЗрдВ:
bool operator ==(const big_integer& left, const big_integer& right) {
рдЕрдм рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рджреВрд╕рд░реЗ рд╕реЗ рдХрдо рд╣реИ:
bool operator <(const big_integer& left, const big_integer& right) { if (left == right) return false; if (left._is_negative) { if (right._is_negative) return ((-right) < (-left)); else return true; } else if (right._is_negative) return false; else { if (left._digits.size() != right._digits.size()) { return left._digits.size() < right._digits.size(); } else { for (long long i = left._digits.size() - 1; i >= 0; --i) { if (left._digits[i] != right._digits[i]) return left._digits[i] < right._digits[i]; } return false; } } }
рдпрд╣рд╛рдВ рд╣рдо рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рдВрдХреЗрдд рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХрд╛рддреНрдордХ рдирд┐рд╖реЗрдз рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рд╕рдорд░реВрдкрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдпреБрдХреНрдд рдкреНрд▓рд╕ рднреА рдкреЗрд╢ рдХрд┐рдпрд╛:
const big_integer big_integer::operator +() const { return big_integer(*this); } const big_integer big_integer::operator -() const { big_integer copy(*this); copy._is_negative = !copy._is_negative; return copy; }
рдЖрдкрдХреЛ рдХреЙрдиреНрд╕реНрдЯреЗрдмрд▓ big_integer рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬреНрдЮрд╛рди рд╣реИ, рди рдХрд┐ big_integer, рд╕рд╛рде рд╣реА рдПрдХ рдлреНрд░реЗрдВрдбрд▓реА рдСрдкрд░реЗрдЯрд░ рдлрдВрдХреНрд╢рди рдФрд░ рдПрдХ рдХреНрд▓рд╛рд╕ рдХреЗ рдореЗрдВрдмрд░ рдСрдкрд░реЗрдЯрд░ рдХреЗ рдмреАрдЪ рдЪрдпрди рдХреЗ рдирд┐рдпрдореЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдореИрдВрдиреЗ
рдЗрд╕ рд▓реЗрдЦ рд╕реЗ рд╕реАрдЦрд╛ рд╣реИред
рдлрд┐рд░ рд╕рдм рдХреБрдЫ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ:
bool operator !=(const big_integer& left, const big_integer& right) { return !(left == right); } bool operator <=(const big_integer& left, const big_integer& right) { return (left < right || left == right); } bool operator >(const big_integer& left, const big_integer& right) { return !(left <= right); } bool operator >=(const big_integer& left, const big_integer& right) { return !(left < right); }
рдЕрдВрдХрдЧрдгрд┐рдд рд╕рдВрдЪрд╛рд▓рди
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛
рдореИрдВ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд╕рд╛рде рд╕рдордЭрджрд╛рд░ рдирд╣реАрдВ рд╣реБрдЖ рдФрд░ рдПрдХ рдХреЙрд▓рдо рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдХреВрд▓ рдЬреЛрдбрд╝ рдХреЛ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ред рдЪреВрдВрдХрд┐ рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣рдореЗрдВ рдСрдкрд░реЗрд╢рди рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдирдпрд╛ рдирдВрдмрд░ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдореИрдВ рддреБрд░рдВрдд рд╕реНрдЯреИрдХ рдкрд░ рдмрд╛рдПрдВ рдСрдкрд░реЗрдВрдб рдХреЛ рдорд╛рди рд╕реЗ рдХреЙрдкреА рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рд╕реАрдзреЗ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рдЗрд╕рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВ:
const big_integer operator +(big_integer left, const big_integer& right) {
рдпрд╣рд╛рдВ рдореИрдВрдиреЗ рдЙрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ "рдорд╣рдВрдЧрд╛" рд╡рд┐рднрд╛рдЬрди рдСрдкрд░реЗрд╢рди рд╕реЗ рдмрдЪрд╛ рдерд╛ рдЬрд╣рд╛рдВ рдкрд░рд┐рдгрд╛рдореА "рд╕рдВрдЦреНрдпрд╛" рдЙрд╕ рдЖрдзрд╛рд░ рд╕реЗ рдмрдбрд╝реА рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдореИрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рддреБрд▓рдирд╛ рджреНрд╡рд╛рд░рд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВред
рдШрдЯрд╛рд╡
рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдШрдЯрд╛рд╡ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреЗ рд╕рдорд╛рди рд╣реИред рдШрдЯрд╛рд╡ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдореА рд╣реЛрдиреЗ рдкрд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ:
const big_integer operator -(big_integer left, const big_integer& right) { if (right._is_negative) return left + (-right); else if (left._is_negative) return -(-left + right); else if (left < right) return -(right - left); int carry = 0; for (size_t i = 0; i < right._digits.size() || carry != 0; ++i) { left._digits[i] -= carry + (i < right._digits.size() ? right._digits[i] : 0); carry = left._digits[i] < 0; if (carry != 0) left._digits[i] += big_integer::BASE; } left._remove_leading_zeros(); return left; }
рд╡реЗрддрди рд╡реГрджреНрдзрд┐ рдФрд░ рдЧрд┐рд░рд╛рд╡рдЯ
рдЗрди рджреЛ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝ рдФрд░ рдШрдЯрд╛рд╡ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
big_integer& big_integer::operator +=(const big_integer& value) { return *this = (*this + value); } big_integer& big_integer::operator -=(const big_integer& value) { return *this = (*this - value); }
рдлрд┐рд░ рдСрдкрд░реЗрд╢рди рдХреЗ рдЙрдкрд╕рд░реНрдЧ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреЗрд╡рд▓ рдереЛрдбрд╝реЗ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛрддреЗ рд╣реИрдВ:
const big_integer big_integer::operator++() { return (*this += 1); } const big_integer big_integer::operator ++(int) { *this += 1; return *this - 1; } const big_integer big_integer::operator --() { return *this -= 1; } const big_integer big_integer::operator --(int) { *this -= 1; return *this + 1; }
рдЧреБрдгрди
рдореИрдВрдиреЗ рдХрд░рд╛рддрд╕реБрдмрд╛ рдХрд╛ рддреЗрдЬ рдЧреБрдгрд╛ рдирд╣реАрдВ рд▓рд┐рдЦрд╛, рдФрд░ рдлрд┐рд░ рд╕реЗ "рд╕реНрдХреВрд▓" рдЕрдВрдХрдЧрдгрд┐рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛:
const big_integer operator *(const big_integer& left, const big_integer& right) { big_integer result; result._digits.resize(left._digits.size() + right._digits.size()); for (size_t i = 0; i < left._digits.size(); ++i) { int carry = 0; for (size_t j = 0; j < right._digits.size() || carry != 0; ++j) { long long cur = result._digits[i + j] + left._digits[i] * 1LL * (j < right._digits.size() ? right._digits[j] : 0) + carry; result._digits[i + j] = static_cast<int>(cur % big_integer::BASE); carry = static_cast<int>(cur / big_integer::BASE); } }
рд╡рд┐рднрд╛рдЬрди
рдЪреВрдВрдХрд┐ рдореБрдЭреЗ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рддреЗрдЬ рддрд░реАрдХреЗ рдирд╣реАрдВ рдорд┐рд▓реЗ, рдЗрд╕рд▓рд┐рдП рд╣рдо рд╕реНрдХреВрд▓ рдбрд┐рд╡реАрдЬрди рдХреЙрд░реНрдирд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдЪрд▓реЛ рдЙрдЪреНрдЪ рд░реИрдВрдХ рдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рд╣рдореЗрдВ рд▓рд╛рднрд╛рдВрд╢ рдХреА рдЕрдзрд┐рдХрддрдо рд╕рдВрднрд╡ рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рд▓рд╛рднрд╛рдВрд╢ рдХреЗ рд╡рд░реНрддрдорд╛рди рдореВрд▓реНрдп рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдЕрдзрд┐рдХрддрдо рдореВрд▓реНрдп рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдЦреЛрдЬ рджреНрд╡рд╛рд░рд╛ рдЦреЛрдЬрд╛ рдЬрд╛рдПрдЧрд╛ред рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рджрд╛рдИрдВ рдУрд░ "рд╢рд┐рдлреНрдЯрд┐рдВрдЧ" рдХреЗ рдХрд╛рд░реНрдп рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рд╣рдореЗрдВ рдмрд┐рдЯреНрд╕ рдкрд░ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛:
void big_integer::_shift_right() { if (this->_digits.size() == 0) { this->_digits.push_back(0); return; } this->_digits.push_back(this->_digits[this->_digits.size() - 1]);
рдЕрдм рд╣рдо рд╕реНрд╡рдпрдВ рд╡рд┐рднрд╛рдЬрди рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВрдЧреЗ:
const big_integer operator /(const big_integer& left, const big_integer& right) {
рдпрд╣рд╛рдБ
big_integer::divide_by_zero
рдПрдХ рдЦрд╛рд▓реА рд╡рд░реНрдЧ рд╣реИ рдЬрд┐рд╕реЗ
std::exception
рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛
std::exception
ред
рд╢реЗрд╖ рд▓реЗрдирд╛
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдкрд┐рдЫрд▓реЗ рдСрдкрд░реЗрд╢рди рдореЗрдВ, рд╢реЗрд╖ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ
current
рдЪрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рд╢реЗрд╖ рдХреЗ рд╕рдВрдХреЗрдд рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдкрд░ рдЖрд╢реНрдЪрд░реНрдп рдХрд┐рдпрд╛ред
рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдПрдХ рд╡рд┐рднрд╛рдЬрди рдХрд╛ рд╢реЗрд╖ рд╣рдореЗрд╢рд╛ рд╕рдХрд╛рд░рд╛рддреНрдордХ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рдЗрд╕ рдСрдкрд░реЗрд╢рди рдХрд╛ рдпрд╣ рд╕рдВрд╕реНрдХрд░рдг рд▓рд┐рдЦрд╛:
const big_integer operator %(const big_integer& left, const big_integer& right) { big_integer result = left - (left / right) * right; if (result._is_negative) result += right; return result; }
рдкреЗрдЪреАрджрдЧреА
рдореИрдВрдиреЗ рддреНрд╡рд░рд┐рдд рдШрд╛рддрд╛рдВрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдЗрд╕рдореЗрдВ рд╡рд┐рд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП рд╕рдВрдЦреНрдпрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЪреВрдБрдХрд┐ 2 рдХреЗ рдмрдВрдЯрд╡рд╛рд░реЗ рдХреЗ рд╢реЗрд╖ рднрд╛рдЧ рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ рдорд╣рдВрдЧрд╛ рд╣реЛрдЧрд╛, рдЗрд╕реЗ рд╣рд▓реНрдХреЗ рдврдВрдЧ рд╕реЗ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреЗ рд╣реИрдВ:
bool big_integer::odd() const { if (this->_digits.size() == 0) return false; return this->_digits[0] & 1; } bool big_integer::even() const { return !this->odd(); }
рдЕрдм рдЗрд░реЗрдХреНрд╢рди рдХреЛ рд╣реА рд▓рд┐рдЦреЗрдВ:
const big_integer big_integer::pow(big_integer n) const { big_integer a(*this), result(1); while (n != 0) { if (n.odd()) result *= a; a *= a; n /= 2; } return result; }
рдкреВрд░реНрдг рд╡рд░реНрдЧ рдХреЛрдб:
pastebin.com/MxQdP5s9рд╡рд╣ рд╕рдм рд╣реИ! рдЕрдм рдЖрдк рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 2
1000 , рдпрд╛ рддрдереНрдпрд╛рддреНрдордХ 100:
#include <iostream> #include "big_integer.hpp" using namespace std; int main() { big_integer bi("2"), bi2 = 100; cout << bi.pow(1000) << endl; big_integer f = 1; for (big_integer i = 2; i <= bi2; ++i) f *= i; cout << f << endl; }
рд╕рд╛рд╣рд┐рддреНрдп
- e-maxx.ru - рд╕рд╛рдЗрдЯ рдЬреЛ рдУрд▓рдВрдкрд┐рдпрд╛рдб рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рд╕рдорд░реНрдкрд┐рдд рд╣реИ
- cppalgo.blogspot.ru/2010/05/blog-post.html - рдЗрдЧреЛрд░ рдмрд┐рд▓реНрд▓рд╛рдпреЗрд╡ рдХрд╛ рдмреНрд▓реЙрдЧ