1088. Rational Arithmetic (20)解题报告

//我使用了C++的类和运算符重载
#include <iostream>
#include <cstdio>
#include <cstdlib>


using namespace std;
class Rnum{
public:

    Rnum(): num(0), denum(0){}

    Rnum(int num, int denum)
    {
        this->num = num;
        this->denum = denum;
    }

    Rnum(const Rnum &r)
    {
        this->num = r.num;
        this->denum = r.denum;
    }

    void print() const
    {
      long long n1, n2, n3;
      n2 = this->num;
      n3 = this->denum;
      if(!n3)
      {
        printf("Inf");
      return; 
    }
      n1 = n2 / n3;
      n2 %= n3;
      if(n1)
      {
        n2 = n2 < 0 ? -n2 : n2;
         n3 = n3 < 0 ? -n3 : n3;
        if(n1 < 0)
      {
        if(n2)
        {
          printf("(%lld %lld/%lld)", n1, n2, n3);  
        }  
        else
        {
          printf("(%lld)", n1);
        }
      }
      else
      {
        if(n2)
        {
          printf("%lld %lld/%lld", n1, n2, n3);
        }
        else
        {
          printf("%lld", n1);
        }
      }
    }
    else
    {
      if(!n2)
      {
        printf("0");
      }
      else if(n2 < 0 && n3 < 0)
      {
        n2 = -n2;
        n3 = -n3;
        printf("%lld/%lld", n2, n3); 
      }
      else if(n2 < 0)
      {
        printf("(%lld/%lld)", n2, n3);
      }
      else if(n3 < 0)
      {
        n2 = -n2;
        n3 = -n3;
        printf("(%lld/%lld)", n2, n3);
      }
      else
      {
        printf("%lld/%lld", n2, n3);
      }
    }
        return;
    }

    void simplify()
    {
        long long n1, n2, n3;
        if(num > 0 && denum < 0 || num < 0 && denum < 0)
    {
      num = -num;
      denum = -denum;  
    }
        if(!num)
        {
          return;
    }
    if(!denum)
    {
      return;
    }
        n1 = num > 0 ? num : -num;
        n2 = denum > 0 ? denum : -denum;
        while(n1 % n2)
        {
            n3 = n1 % n2;
            n1 = n2;
            n2 = n3;
        }
        num /= n2;
        denum /= n2;
        return;
    }
  friend Rnum operator+(Rnum r1, Rnum r2);
  friend Rnum operator-(Rnum r1, Rnum r2);
  friend Rnum operator*(Rnum r1, Rnum r2);
  friend Rnum operator/(Rnum r1, Rnum r2);
private:
    long long num, denum;
};

Rnum operator + (Rnum r1, Rnum r2)
{
  Rnum r3;
    r3.num = r1.num * r2.denum + r1.denum * r2.num;
    r3.denum = r1.denum * r2.denum;
    r3.simplify();
    return r3;
}

Rnum operator-(Rnum r1, Rnum r2)
{
    Rnum r3;
    r3.num = r1.num * r2.denum - r1.denum * r2.num;
    r3.denum = r1.denum * r2.denum;
    r3.simplify();
    return r3;
}

Rnum operator*(Rnum r1, Rnum r2)
{
    Rnum r3;
    r3.num = r1.num * r2.num;
    r3.denum = r1.denum * r2.denum;
    r3.simplify();
    return r3;
}

Rnum operator/(Rnum r1, Rnum r2)
{
    Rnum r3;
    r3.num = r1.num * r2.denum;
    r3.denum = r1.denum * r2.num;
    r3.simplify();
    return r3;
}


int main()
{
    long long n1, n2, n3, n4;
    scanf("%lld/%lld %lld/%lld", &n1, &n2, &n3, &n4);
    Rnum r1(n1, n2), r2(n3, n4), r3;
    r1.simplify();
    r2.simplify();
    r3 = r1 + r2;
    r1.print();
    printf(" + ");
    r2.print();
    printf(" = ");
    r3.print();
    putchar('\n');
    r3 = r1 - r2;
    r1.print();
    printf(" - ");
    r2.print();
    printf(" = ");
    r3.print();
    putchar('\n');
    r3 = r1 * r2;
    r1.print();
    printf(" * ");
    r2.print();
    printf(" = ");
    r3.print();
    putchar('\n');
    r3 = r1 / r2;
    r1.print();
    printf(" / ");
    r2.print();
    printf(" = ");
    r3.print();
    putchar('\n');
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值