#include<cstdio>
#include<algorithm>
using namespace std;
long long gcd(long long a,long long b){//最大公约数,用于化简
return !b? a:gcd(b,a%b);
}
struct fraction{
long long numerator,denominator;
}a,b;
fraction reduction(fraction a){//化简
if(a.numerator==0) a.denominator=1;//如果为零,则分子为零,分母为1
else{ //分子分母同除最大公约数
long long d=gcd(abs(a.numerator),abs(a.denominator));
a.numerator/=d;
a.denominator/=d;
}
return a;
}
fraction add(fraction a,fraction b){//分式加法
fraction result;
result.numerator=a.numerator*b.denominator+b.numerator*a.denominator;
result.denominator=a.denominator*b.denominator;
return reduction(result);
}
fraction deduct(fraction a,fraction b){//减法
fraction result;
result.numerator=a.numerator*b.denominator-b.numerator*a.denominator;
result.denominator=a.denominator*b.denominator;
return reduction(result);
}
fraction mutiply(fraction a,fraction b){//乘法
fraction result;
result.numerator=a.numerator*b.numerator;
result.denominator=a.denominator*b.denominator;
return reduction(result);
}
fraction divide(fraction a,fraction b){//除法
fraction result;
result.numerator=a.numerator*b.denominator;
result.denominator=a.denominator*b.numerator;
if(result.denominator<0){//要保证分母非负
result.numerator=-result.numerator;
result.denominator=-result.denominator;
}
return reduction(result);
}
void show(fraction a){//输出分数
a=reduction(a);//先化简
if(a.numerator>=0){
if(a.denominator==1) printf("%lld",a.numerator);//整数,直接输出分子
else if(abs(a.numerator)>abs(a.denominator)) printf("%lld %lld/%lld",a.numerator/a.denominator,abs(a.numerator)%a.denominator,a.denominator);
//假分数要按照带分数的格式输出
else printf("%lld/%lld",a.numerator,a.denominator); //真分数,正常输出
}
else{//小于0要加括号
if(a.denominator==1) printf("(%lld)",a.numerator);//整数,直接输出分子
else if(abs(a.numerator)>abs(a.denominator)) printf("(%lld %lld/%lld)",a.numerator/a.denominator,abs(a.numerator)%a.denominator,a.denominator);
//假分数要按照带分数的格式输出
else printf("(%lld/%lld)",a.numerator,a.denominator); //真分数,正常输出
}
}
int main(){
scanf("%lld/%lld %lld/%lld",&a.numerator,&a.denominator,&b.numerator,&b.denominator);
show(a);printf(" + ");show(b);printf(" = ");show(add(a,b));printf("\n");
show(a);printf(" - ");show(b);printf(" = ");show(deduct(a,b));printf("\n");
show(a);printf(" * ");show(b);printf(" = ");show(mutiply(a,b));printf("\n");
show(a);printf(" / ");show(b);printf(" = ");
if(b.numerator!=0)show(divide(a,b));
else printf("Inf");//除数为0
}
PAT A1088/B1034 Rational Arithmetic (20point(s))
猜你喜欢
转载自blog.csdn.net/weixin_44546393/article/details/105475220
今日推荐
周排行