Advertisement
KShah

Untitled

Nov 24th, 2021
1,180
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.50 KB | None | 0 0
  1. class Rational{
  2.     private:
  3.         BigInteger num;
  4.         BigInteger den;
  5.         void make_irred(BigInteger &self, BigInteger &other){
  6.             BigInteger gcd_ = gcd(self, other);
  7.             self /= gcd_;
  8.             other /= gcd_;
  9.         }
  10.         void Normalize(){
  11.             if(den.get_sign() == -1){
  12.                 num.change_sign();
  13.                 den.change_sign();
  14.             }
  15.             make_irred(num, den);
  16.         }
  17.     public:
  18.         Rational(const BigInteger &other){
  19.             num = BigInteger(other);
  20.             den = BigInteger(1);
  21.         }
  22.         Rational(const int other){
  23.             num = BigInteger(other);
  24.             den = BigInteger(1);
  25.         }
  26.         Rational(){
  27.             num = 0;
  28.             den = 1;
  29.         }
  30.         Rational& operator +=(const Rational &other){
  31.             num *= other.den;
  32.             num += other.num * den;
  33.             den *= other.den;
  34.            // make_irred(num, den);
  35.             Normalize();
  36.             return *this;
  37.         }
  38.  
  39.         Rational operator -() const {
  40.             Rational ans = *this;
  41.             ans.num *= -1;
  42.             return ans;
  43.         }
  44.         Rational& operator -=(const Rational &other){
  45.             *this += -other;
  46.             return *this;
  47.         }
  48.         Rational& operator *=(const Rational &other){
  49.             num *= other.num;
  50.             den *= other.den;
  51.            // make_irred(num, den);
  52.             Normalize();
  53.             return *this;
  54.         }
  55.         Rational& operator /=(const Rational &other){
  56.             num *= other.den;
  57.             den *= other.num;
  58.            // make_irred(num, den);
  59.             Normalize();
  60.             return *this;
  61.         }
  62.         Rational operator /(const Rational &other) const {
  63.             Rational ans = *this;
  64.             ans /= other;
  65.             return ans;
  66.         }
  67.         Rational& operator %=(const Rational &other){
  68.             *this = *this - *this / other * other;
  69.             return *this;
  70.         }
  71.         Rational operator %(const Rational &other) const {
  72.             Rational res = *this;
  73.             res %= other;
  74.             return res;
  75.         }
  76.         Rational operator *(const Rational &other) const {
  77.             Rational ans = *this;
  78.             ans *= other;
  79.             return ans;
  80.         }
  81.         Rational operator +(const Rational &other) const {
  82.             Rational ans = *this;
  83.             ans += other;
  84.             return ans;
  85.         }
  86.         Rational operator -(const Rational &other) const {
  87.             Rational ans = *this;
  88.             ans -= other;
  89.             return ans;
  90.         }
  91.         std::string toString() const {
  92.             std::string result = "";
  93.             if(num.get_sign() == -1){
  94.                 result += '-';
  95.             }
  96.             result += num.toString();
  97.             if(den != 1){
  98.                 result += '/';
  99.                 result += den.toString();
  100.             }
  101.             return result;
  102.         }
  103.         friend std::istream& operator>>(std::istream &in, Rational& self){
  104.             std::string input1;
  105.             std::string input2;
  106.             in >> input1 >> input2;
  107.             self.num = BigInteger(input1);
  108.             self.den = BigInteger(input2);
  109.             self.Normalize();
  110.             return in;
  111.         }
  112.         friend std::ostream& operator<<(std::ostream &out, const Rational& P){
  113.             //print(P.toString());
  114.             out << P.toString();
  115.             return out;
  116.         }
  117.         bool SmallerMod2(const Rational &self, const Rational &other) const {
  118.             Rational q = self / other;
  119.            // $$
  120.             if(SmallerMod(q.num, q.den)){
  121.                 return 1;
  122.             }
  123.             return 0;
  124.         }
  125.         bool operator ==(const Rational &other) const {
  126.             return toString() == other.toString();
  127.         }
  128.         bool operator <(const Rational &other) const {
  129.             bool smaller = SmallerMod2(*this, other);
  130.             if(num.get_sign() != other.num.get_sign()){
  131.                 if(num.get_sign() == 1){
  132.                     return 0;
  133.  
  134.                 }else{
  135.                     return 1;
  136.                 }
  137.             }
  138.             if(*this == other){
  139.                 return 0;
  140.             }
  141.             if(num.get_sign() == 1){
  142.                 return smaller;
  143.             }
  144.             return smaller ^ 1;
  145.         }
  146.         bool operator <=(const Rational &other) const {
  147.             return (*this < other) || (*this == other);
  148.         }
  149.         bool operator >(const Rational &other) const {
  150.             return other < *this;
  151.         }
  152.         bool operator >=(const Rational &other) const {
  153.             return (*this > other) || (*this == other);
  154.         }
  155.         bool operator !=(const Rational &other) const {
  156.             return !(*this == other);
  157.         }
  158.         Rational& operator =(const Rational &other){
  159.             num = other.num;
  160.             den = other.den;
  161.             return *this;
  162.         }
  163.  
  164. /*        bool operator ==(const int &other) const {
  165.             return *this == Rational(other);
  166.         }
  167.         bool operator <(const int &other) const {
  168.             return *this < Rational(other);
  169.         }
  170.         bool operator <=(const int &other) const {
  171.             return *this <= Rational(other);
  172.         }
  173.         bool operator >(const int &other) const {
  174.             return *this > Rational(other);
  175.         }
  176.         bool operator >=(const int &other) const {
  177.             return *this >= Rational(other);
  178.         }
  179.         bool operator !=(const int &other) const {
  180.             return *this != Rational(other);
  181.         }
  182.  
  183.          Rational& operator -=(const int other){
  184.             *this += -Rational(other);
  185.             return *this;
  186.         }
  187.         Rational& operator *=(const int other_){
  188.             Rational other = other_;
  189.             num *= other.num;
  190.             den *= other.den;
  191.            // make_irred(num, den);
  192.             Normalize();
  193.             return *this;
  194.         }
  195.         Rational& operator /=(const int other_){
  196.             Rational other = other_;
  197.             num *= other.den;
  198.             den *= other.num;
  199.            // make_irred(num, den);
  200.             Normalize();
  201.             return *this;
  202.         }
  203.         Rational operator /(const int other) const {
  204.             Rational ans = *this;
  205.             ans /= Rational(other);
  206.             return ans;
  207.         }
  208.         Rational& operator %=(const int other_){
  209.             Rational other = Rational(other_);
  210.             *this = *this - *this / other * other;
  211.             return *this;
  212.         }
  213.         Rational operator %(const int other) const {
  214.             Rational res = *this;
  215.             res %= Rational(other);
  216.             return res;
  217.         }
  218.         Rational operator *(const int other) const {
  219.             Rational ans = *this;
  220.             ans *= Rational(other);
  221.             return ans;
  222.         }
  223.         Rational operator +(const int other) const {
  224.             Rational ans = *this;
  225.             ans += Rational(other);
  226.             return ans;
  227.         }
  228.         Rational operator -(const int other) const {
  229.             Rational ans = *this;
  230.             ans -= Rational(other);
  231.             return ans;
  232.         }*/
  233.  
  234.         friend Rational operator +(const int self, const Rational& other){
  235.             return Rational(self) + other;
  236.         }
  237.         friend Rational operator -(const int self, const Rational& other){
  238.             return Rational(self) - other;
  239.         }
  240.         friend Rational operator *(const int self, const Rational& other){
  241.            return Rational(self) * other;
  242.         }
  243.         friend Rational operator /(const int self, const Rational& other){
  244.             return Rational(self) / other;
  245.         }
  246.         friend Rational operator %(const int self, const Rational& other){
  247.             return Rational(self) % other;
  248.         }
  249.         explicit operator bool() const {
  250.             return num;
  251.         }
  252.         std::string asDecimal(size_t precision) const {
  253.             BigInteger A = num % den;
  254.             std::string ans = (num / den).toString();
  255.             ans += '.';
  256.             std::string degree = "1";
  257.             for(size_t i = 0; i < precision; ++i){
  258.                 degree += '0';
  259.             }
  260.             std::cout << A << ' ' << den << ' ' << ans << '\n';
  261.             A *= BigInteger(degree);
  262.             ans += (A / den).toString();
  263.             return ans;
  264.         }
  265.         explicit operator double() const {
  266.             return std::stod(asDecimal(100));
  267.         }
  268. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement