1088. Rational Arithmetic (20)

来源:互联网 发布:ubuntu 设置mac 编辑:程序博客网 时间:2024/05/17 04:25

题目:https://www.patest.cn/contests/pat-a-practise/1088

代码:

#include<cstdio>  #include<cstring>  #include<cstdlib>  #include<algorithm>  using namespace std;  struct fra{      long long up;      long long down;  };  long long gcd(long long a,long long b){      return b==0?a:gcd(b,a%b);  }  fra change(fra t){      if(t.down<0){          t.up=-t.up;          t.down=-t.down;      }      if(t.up==0){          t.down=1;      }else{          int d=gcd(abs(t.up),abs(t.down));          t.up/=d;          t.down/=d;      }      return t;  }  fra add(fra a,fra b){      fra temp;      temp.down=a.down*b.down;      temp.up=a.down*b.up+a.up*b.down;      return change(temp);  }  fra minu(fra a,fra b){   fra temp;      temp.down=a.down*b.down;      temp.up=a.up*b.down-a.down*b.up;      return change(temp); }fra multi(fra a,fra b){fra temp;      temp.down=a.down*b.down;  temp.up=a.up*b.up;      return change(temp); }fra divide(fra a,fra b){fra temp;      temp.down=a.down*b.up;  temp.up=a.up*b.down;      return change(temp); }void myshow(fra t){ t=change(t); if(t.up<0) printf("("); if(t.down==1) printf("%lld",t.up); else if(abs(t.up)>abs(t.down)){ printf("%lld %lld/%lld",t.up/t.down,abs(t.up)%t.down,t.down); }else { printf("%lld/%lld",t.up,t.down); } if(t.up<0)printf(")");}int main()  {  fra a,b;scanf("%lld/%lld %lld/%lld",&a.up,&a.down,&b.up,&b.down);myshow(a);printf(" + ");myshow(b);printf(" = ");myshow(add(a,b));printf("\n");myshow(a);printf(" - ");myshow(b);printf(" = ");myshow(minu(a,b));printf("\n");myshow(a);printf(" * ");myshow(b);printf(" = ");myshow(multi(a,b));printf("\n");myshow(a);printf(" / ");myshow(b);printf(" = ");if(b.up==0) printf("Inf");else myshow(divide(a,b));    system("pause");  }                  

0 0