1088. Rational Arithmetic (20)解题报告

来源:互联网 发布:网络销售彩票诈骗流程 编辑:程序博客网 时间:2024/05/17 09:00
//我使用了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