#define LOCAL
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b){
return b==0?a:gcd(b,a%b);
}
struct Fraction{
ll up,down;
};
Fraction reduction(Fraction a){
if(a.down<0){
a.up=-a.up;
a.down=-a.down;
}
if(a.up==0){
a.down=1;
}else{
int d=gcd(abs(a.up),abs(a.down));
a.down/=d;a.up/=d;
}
return a;
}
Fraction add(Fraction a,Fraction b){
Fraction res;
res.up=a.up*b.down+a.down*b.up;
res.down=a.down*b.down;
return reduction(res);
}
Fraction mul(Fraction a,Fraction b){
Fraction res;
res.up=a.up*b.up;
res.down=a.down*b.down;
return reduction(res);
}
Fraction div(Fraction a,Fraction b){
Fraction res;
if(b.up!=0){
res.down=a.down*b.up;
res.up=a.up*b.down;
return reduction(res);
}else{
res.down=0;
res.up=0;
return res;
}
}
Fraction sub(Fraction a,Fraction b){
Fraction res;
res.up=a.up*b.down-a.down*b.up;
res.down=a.down*b.down;
return reduction(res);
}
void showResult(Fraction r){
r=reduction(r);
if(r.up<0){
if(r.down==1) printf("(%lld)",r.up);
else if(abs(r.up)>r.down) printf("(%lld %lld/%lld)",r.up/r.down,abs(r.up)%r.down,r.down);
else printf("(%lld/%lld)",r.up,r.down);
}else{
if(r.down==1) printf("%lld",r.up);
else if(abs(r.up)>r.down) printf("%lld %lld/%lld",r.up/r.down,abs(r.up)%r.down,r.down);
else printf("%lld/%lld",r.up,r.down);
}
}
int main()
{
#ifdef LOCAL
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
#endif // LOCAL
Fraction a,b;
char op[4]={'+','-','*','/'};
scanf("%lld/%lld %lld/%lld",&a.up,&a.down,&b.up,&b.down);
for(int i=0;i<4;i++){
showResult(a);
printf(" %c ",op[i]);
showResult(b);
printf(" = ");
if(op[i]=='+') showResult(add(a,b));
else if(op[i]=='-') showResult(sub(a,b));
else if(op[i]=='*') showResult(mul(a,b));
else{
if(div(a,b).down!=0) showResult(div(a,b));
else printf("Inf");
}
printf("\n");
}
return 0;
}
【PAT】1088. Rational Arithmetic
最新推荐文章于 2024-07-10 07:45:00 发布