C ++ рдореЗрдВ рд▓рдВрдмреА рдЕрдВрдХрдЧрдгрд┐рдд рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

рдЕрдзрд┐рдХрд╛рдВрд╢ рдЖрдзреБрдирд┐рдХ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ, рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдЕрдм рдЙрди рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕реАрдзреЗ рд╣реЗрд░рдлреЗрд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХрд╣реАрдВ, рдкрд╛рдЗрдерди рдпрд╛ рд╣рд╛рд╕реНрдХреЗрд▓ рдХреА рддрд░рд╣, рд▓рдВрдмреЗ рдкреВрд░реНрдгрд╛рдВрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рднрд╛рд╖рд╛ рдХреЗ рдореВрд▓ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХрд╣реАрдВ, рдЬрд╛рд╡рд╛ рдпрд╛ рд╕реА # рдореЗрдВ, рдЗрд╕реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд░реНрдЧреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╕реА ++ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ, рд▓рдВрдмреА рд╕рдВрдЦреНрдпрд╛ рдЕрднреА рднреА рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕реЗ рдЦреБрдж рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред

рд╡рд░реНрдЧ рд╕рдВрд░рдЪрдирд╛

рдкрд╣рд▓реА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдирдВрдмрд░ рдХреЛ рдХреИрд╕реЗ рд╕реНрдЯреЛрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдореИрдВ рдЗрд╕реЗ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдПрдХ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реВрдВ, рд░рд┐рд╡рд░реНрд╕ рдСрд░реНрдбрд░ рдореЗрдВ (рдпрд╣ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИ), рддреБрд░рдВрдд рд╕рд░рдгреА рдХреЗ рдПрдХ рддрддреНрд╡ рдореЗрдВ 9 рдЕрдВрдХ (рдЬреЛ рдореЗрдореЛрд░реА рдмрдЪрд╛рддрд╛ рд╣реИ):
class big_integer { //    (1 000 000 000) static const int BASE = 1000000000; //    std::vector<int> _digits; //   bool _is_negative; }; 

рдореЗрд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рд╢реВрдиреНрдп рдХреЗ рджреЛ рддреБрд░рдВрдд рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╣реЛрдВрдЧреЗ - рдПрдХ рдЦрд╛рд▓реА рд╡реЗрдХреНрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдФрд░ рдПрдХ рдПрдХрд▓ рд╢реВрдиреНрдп рдХреЗ рд╕рд╛рде рд╡реЗрдХреНрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВред

рд╕рдВрдЦреНрдпрд╛ рдирд┐рд░реНрдорд╛рдг

рдкрд╣рд▓реА рдЪреАрдЬ рдЬреЛ рдЖрдкрдХреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реАрдЦрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рд╡рд╣ рдПрдХ рдирдВрдмрд░ рдмрдирд╛рдирд╛ рд╣реИред рдЗрд╕реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реЗ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
 big_integer::big_integer(std::string str) { if (str.length() == 0) { //      this->_is_negative = false; } else { if (str[0] == '-') { str = str.substr(1); this->_is_negative = true; } else { this->_is_negative = false; } // - i    size_t.      , //   int      ,   long long for (long long i = str.length(); i > 0; i -= 9) { if (i < 9) this->_digits.push_back(atoi(str.substr(0, i).c_str())); else this->_digits.push_back(atoi(str.substr(i - 9, 9).c_str())); } //     ,    this->_remove_leading_zeros(); } } 

рдЕрдЧреНрд░рдгреА рд╢реВрдиреНрдп рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдХреЛрдб рдЕрдкрдорд╛рди рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рд╣реИ:
 void big_integer::_remove_leading_zeros() { while (this->_digits.size() > 1 && this->_digits.back() == 0) { this->_digits.pop_back(); } //   ,        if (this->_digits.size() == 1 && this->_digits[0] == 0) this->_is_negative = false; } 

рд╣рдореЗрдВ рдирд┐рдпрдорд┐рдд рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдмрджрд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:
 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(); //        9  //    -,     char old_fill = os.fill('0'); for (long long i = static_cast<long long>(bi._digits.size()) - 2; i >= 0; --i) { os << std::setw(9) << bi._digits[i]; } os.fill(old_fill); } return os; } big_integer::operator std::string() const { std::stringstream ss; ss << *this; return ss.str(); } 


рд╕рдВрдЦреНрдпрд╛ рддреБрд▓рдирд╛

рдЕрдм рд╣рдореЗрдВ рдпрд╣ рд╕реАрдЦрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рджреЛ рдирдВрдмрд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдХреИрд╕реЗ рдХрд░реЗрдВред рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓ рджреЛ рдСрдкрд░реЗрд╢рди рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВ, рдмрд╛рдХреА рдХреЛ рдЙрдирдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рддреЛ, рдкрд╣рд▓реЗ рд╣рдо рд╕реАрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╕рдорд╛рдирддрд╛ рдХреЗ рд▓рд┐рдП рджреЛ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рддреБрд▓рдирд╛ рдХреИрд╕реЗ рдХрд░реЗрдВ:
 bool operator ==(const big_integer& left, const big_integer& right) { //       if (left._is_negative != right._is_negative) return false; //      ,     if (left._digits.empty()) { if (right._digits.empty() || (right._digits.size() == 1 && right._digits[0] == 0)) return true; else return false; } if (right._digits.empty()) { if (left._digits.size() == 1 && left._digits[0] == 0) return true; else return false; } //       ,         () if (left._digits.size() != right._digits.size()) return false; for (size_t i = 0; i < left._digits.size(); ++i) if (left._digits[i] != right._digits[i]) return false; return true; } 


рдЕрдм рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рджреВрд╕рд░реЗ рд╕реЗ рдХрдо рд╣реИ:
 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) { //        //   ,      if (left._is_negative) { if (right._is_negative) return -(-left + (-right)); else return right - (-left); } else if (right._is_negative) return left - (-right); int carry = 0; //      for (size_t i = 0; i < std::max(left._digits.size(), right._digits.size()) || carry != 0; ++i) { if (i == left._digits.size()) left._digits.push_back(0); left._digits[i] += carry + (i < right._digits.size() ? right._digits[i] : 0); carry = left._digits[i] >= big_integer::BASE; if (carry != 0) left._digits[i] -= big_integer::BASE; } return left; } 

рдпрд╣рд╛рдВ рдореИрдВрдиреЗ рдЙрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ "рдорд╣рдВрдЧрд╛" рд╡рд┐рднрд╛рдЬрди рдСрдкрд░реЗрд╢рди рд╕реЗ рдмрдЪрд╛ рдерд╛ рдЬрд╣рд╛рдВ рдкрд░рд┐рдгрд╛рдореА "рд╕рдВрдЦреНрдпрд╛" рдЙрд╕ рдЖрдзрд╛рд░ рд╕реЗ рдмрдбрд╝реА рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдореИрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рддреБрд▓рдирд╛ рджреНрд╡рд╛рд░рд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВред

рдШрдЯрд╛рд╡

рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдШрдЯрд╛рд╡ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреЗ рд╕рдорд╛рди рд╣реИред рдШрдЯрд╛рд╡ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдореА рд╣реЛрдиреЗ рдкрд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ:
 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); } } //     result._is_negative = left._is_negative != right._is_negative; result._remove_leading_zeros(); return result; } 


рд╡рд┐рднрд╛рдЬрди

рдЪреВрдВрдХрд┐ рдореБрдЭреЗ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рддреЗрдЬ рддрд░реАрдХреЗ рдирд╣реАрдВ рдорд┐рд▓реЗ, рдЗрд╕рд▓рд┐рдП рд╣рдо рд╕реНрдХреВрд▓ рдбрд┐рд╡реАрдЬрди рдХреЙрд░реНрдирд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдЪрд▓реЛ рдЙрдЪреНрдЪ рд░реИрдВрдХ рдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рд╣рдореЗрдВ рд▓рд╛рднрд╛рдВрд╢ рдХреА рдЕрдзрд┐рдХрддрдо рд╕рдВрднрд╡ рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рд▓рд╛рднрд╛рдВрд╢ рдХреЗ рд╡рд░реНрддрдорд╛рди рдореВрд▓реНрдп рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдЕрдзрд┐рдХрддрдо рдореВрд▓реНрдп рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдЦреЛрдЬ рджреНрд╡рд╛рд░рд╛ рдЦреЛрдЬрд╛ рдЬрд╛рдПрдЧрд╛ред рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рджрд╛рдИрдВ рдУрд░ "рд╢рд┐рдлреНрдЯрд┐рдВрдЧ" рдХреЗ рдХрд╛рд░реНрдп рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рд╣рдореЗрдВ рдмрд┐рдЯреНрд╕ рдкрд░ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛:
 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]); //             , //  i  ""  size_t for (size_t i = this->_digits.size() - 2; i > 0; --i) this->_digits[i] = this->_digits[i - 1]; this->_digits[0] = 0; } 

рдЕрдм рд╣рдо рд╕реНрд╡рдпрдВ рд╡рд┐рднрд╛рдЬрди рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВрдЧреЗ:
 const big_integer operator /(const big_integer& left, const big_integer& right) { //     if (right == 0) throw big_integer::divide_by_zero(); big_integer b = right; b._is_negative = false; big_integer result, current; result._digits.resize(left._digits.size()); for (long long i = static_cast<long long>(left._digits.size()) - 1; i >= 0; --i) { current._shift_right(); current._digits[0] = left._digits[i]; current._remove_leading_zeros(); int x = 0, l = 0, r = big_integer::BASE; while (l <= r) { int m = (l + r) / 2; big_integer t = b * m; if (t <= current) { x = m; l = m + 1; } else r = m - 1; } result._digits[i] = x; current = current - b * x; } result._is_negative = left._is_negative != right._is_negative; result._remove_leading_zeros(); return result; } 

рдпрд╣рд╛рдБ 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; } 


рд╕рд╛рд╣рд┐рддреНрдп

  1. e-maxx.ru - рд╕рд╛рдЗрдЯ рдЬреЛ рдУрд▓рдВрдкрд┐рдпрд╛рдб рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рд╕рдорд░реНрдкрд┐рдд рд╣реИ
  2. cppalgo.blogspot.ru/2010/05/blog-post.html - рдЗрдЧреЛрд░ рдмрд┐рд▓реНрд▓рд╛рдпреЗрд╡ рдХрд╛ рдмреНрд▓реЙрдЧ

Source: https://habr.com/ru/post/In172285/


All Articles