PAT Basic Level 1034 有理数四则运算 (20 分)

题目链接:

https://pintia.cn/problem-sets/994805260223102976/problems/994805287624491008

AC代码:

#include <iostream>
#include <algorithm>
#include <cstdio>

using namespace std;

typedef long long ll;//记ll为long long

ll gcd(ll a,ll b){
    return b==0?a:gcd(b,a%b);
}

struct Fraction{    //分数
    ll up,down;     //分子,分母
}a,b;

Fraction reduction(Fraction result){//化简
    if(result.down<0){//分母为负数,令分子和分母都变为相反数
        result.up=-result.up;
        result.down=-result.down;
    }
    if(result.up==0){//如果分子为0
        result.down=1;//令分母为1
    }
    else{//如果分子不为0,进行约分
        int d=gcd(abs(result.up),abs(result.down));//分子分母的最大公约数
        result.up/=d;
        result.down/=d;
    }
    return result;
}

Fraction add(Fraction f1,Fraction f2){
    Fraction result;
    result.up=f1.up*f2.down+f2.up*f1.down;//分数和的分子
    result.down=f1.down*f2.down;//分数和的分母
    return reduction(result);//返回结果分数,注意化简
}

Fraction minu(Fraction f1,Fraction f2){//分数f1减去分数f2
    Fraction result;// 分数差的分子
    result.up=f1.up*f2.down-f2.up*f1.down;//分数差的分母
    result.down=f1.down*f2.down;//分数和的分母
    return reduction(result);//返回结果分数,注意化简
}

Fraction multi(Fraction f1,Fraction f2)//分数f1乘以分数f2
{
    Fraction result;
    result.up=f1.up*f2.up;  //分数积的分子
    result.down=f1.down*f2.down;    //分数积的分母
    return reduction(result);//返回结果分数,注意化简
}

Fraction divide(Fraction f1,Fraction f2){//分数f1除以分数f2
    Fraction result;
    result.up=f1.up*f2.down;//分数商的分子
    result.down=f1.down*f2.up;//分数商的分母
    return reduction(result);//返回结果分数,注意化简
}

void showResult(Fraction r){//输出分数x
    r=reduction(r);
    if(r.up<0)  printf("(");
    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);
    }
    if(r.up<0)printf(")");
}

int main(){
    scanf("%lld/%lld %lld/%lld",&a.up,&a.down,&b.up,&b.down);
    //加法
    showResult(a);
    printf(" + ");
    showResult(b);
    printf(" = ");
    showResult(add(a,b));
    printf("\n");
    //减法
    showResult(a);
    printf(" - ");
    showResult(b);
    printf(" = ");
    showResult(minu(a,b));
    printf("\n");
    //乘法
    showResult(a);
    printf(" * ");
    showResult(b);
    printf(" = ");
    showResult(multi(a,b));
    printf("\n");
    //除法
    showResult(a);
    printf(" / ");
    showResult(b);
    printf(" = ");
    if(b.up==0) printf("Inf");
    else  showResult(divide(a,b));

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值