PAT A1088/B1034 Rational Arithmetic (20point(s))

题目链接

#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
}
发布了81 篇原创文章 · 获赞 0 · 访问量 660

猜你喜欢

转载自blog.csdn.net/weixin_44546393/article/details/105475220
今日推荐