【ACM】- PAT. A1088 Rational Arithmetic & PAT. B1034 有理数四则运算【数学问题 - 分数计算】

题目链接
题目分析

分数的四则运算

解题思路

| 分数运算规则


/**********************************
*@ID: 3stone
*@ACM: PAT.A1088 Rational Arithmetic 
     & PAT.B1034 有理数四则运算 
*@Time: 18/8/27
*@IDE: DEV C++ 5.10 
***********************************/
#include<cstdio>
#include<algorithm>
#include<cmath>

using namespace std;

struct Fraction {
    long long up, down;
}; 


//最大公约数 
long long gcd(long long a, long long b) {
    if(a < b) swap(a, b);
    if(b == 0) return a;
    else return gcd(b, a % b);
}

//化简分数 
Fraction reduction(Fraction f) {
    if(f.down < 0) {
        f.up = -f.up;
        f.down = -f.down;
    } 
    if(f.up == 0) f.down = 1;
    else {
        int d = gcd(abs(f.up), abs(f.down));
        f.up /= d;
        f.down /= d;
    }

    return f;
}

//分数加法
Fraction add(Fraction a, Fraction b) {
    a.up = a.up * b.down + b.up * a.down;
    a.down = a.down * b.down;
    return reduction(a);
} 

//分数减法
Fraction minu(Fraction a, Fraction b) {
    a.up = a.up * b.down - b.up * a.down;
    a.down = a.down * b.down;
    return reduction(a);
} 

//分数乘法
Fraction multi(Fraction a, Fraction b) {
    a.up *= b.up;
    a.down *= b.down;
    return reduction(a);
} 

//分数除法
Fraction divide(Fraction a, Fraction b) {
    //判断除数是否为零,根据题目返回信息 
    a.up *= b.down;
    a.down *= b.up;
    return reduction(a);
} 

//输出分数结果 
void showResult(Fraction a) {

    a = reduction(a); 
    if(a.up < 0) printf("(");

    if(a.down == 1) printf("%lld", a.up);
    else if(abs(a.up) > a.down) {
        printf("%lld %lld/%lld", a.up / a.down, abs(a.up) % a.down, a.down); //负号只在整数部分前输出 
    } else {
        printf("%lld/%lld", a.up, a.down);
    }

    if(a.up < 0) printf(")");
}

int main() {

    Fraction f_a, f_b, result;
    while(scanf("%lld/%lld %lld/%lld", &f_a.up, &f_a.down, &f_b.up, &f_b.down) != EOF){

        //加法
        showResult(f_a); printf(" + "); showResult(f_b); printf(" = "); 
        showResult(add(f_a, f_b)); printf("\n");
        //减法 
        showResult(f_a); printf(" - "); showResult(f_b); printf(" = "); 
        showResult(minu(f_a, f_b)); printf("\n");
        //乘法 
        showResult(f_a); printf(" * "); showResult(f_b); printf(" = "); 
        showResult(multi(f_a, f_b)); printf("\n");
        //除法 
        showResult(f_a); printf(" / "); showResult(f_b); printf(" = "); 

        if(f_b.up == 0) printf("Inf");
        else showResult(divide(f_a, f_b)); 
        printf("\n");

    }

    //system("pause");
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值