题意:

给出两个分式(a1/b1 a2/b2),分子、分母的范围为int型,且确保分母不为0。计算两个分数的加减乘除,结果化为最简的形式,即"k a/b",其中若除数为0的话,输出Inf。

思路:

分数四则运算的模板题。分析详见:基础数学问题

代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>//abs()
typedef long long LL;
struct Fraction{
    LL up;//分子
    LL down;//分母
    Fraction():up(),down(){}//默认初始化
    Fraction(int up_,int down_):up(up_),down(down_){}
};

//求最大公约数
int gcd(LL a,LL b){
    ) return a;
    else return gcd(b,a%b);
}

//分数化简
void simplify(Fraction& a){
    ) {
        a.down = -a.down;
        a.up = -a.up;
    }
    ){
        a.down=;
    }else{
        int commonFractor=gcd(abs(a.up), abs(a.down));//注意要加绝对值!!!
        a.up/=commonFractor;
        a.down/=commonFractor;
    }
}
//打印分数
void printFraction(Fraction a){
    simplify(a);
    ) printf("(");
    ) printf("%lld",a.up);//如果分母为1,则只打印分子即可
    else{
        if(abs(a.up)>abs(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);
    }
    ) printf(")");
}

//分数相加
Fraction add(Fraction a,Fraction b){
    Fraction c;
    c.down=a.down*b.down;
    c.up=a.up*b.down+a.down*b.up;
    simplify(c);
    return c;
}
//分数相减
Fraction sub(Fraction a,Fraction b){
    Fraction c;
    c.down=a.down*b.down;
    c.up=a.up*b.down-a.down*b.up;
    simplify(c);
    return c;
}
//分数相乘
Fraction multiply(Fraction a,Fraction b){
    Fraction c;
    c.down=a.down*b.down;
    c.up=a.up*b.up;
    simplify(c);
    return c;
}
//分数相除
Fraction divide(Fraction a,Fraction b){
    Fraction c;
    c.down=a.down*b.up;
    c.up=a.up*b.down;
    simplify(c);
    return c;
}

void showEquation(Fraction a,Fraction b,const char* op)
{
    bool flag=true;
    Fraction ans;
    printFraction(a);
    ){
        printf(" + ");
        ans=add(a,b);
    }){
        printf(" - ");
        ans=sub(a,b);
    }){
        printf(" * ");
        ans=multiply(a,b);
    }else {
        printf(" / ");
        ) flag=false;
        else ans=divide(a,b);
    }
    printFraction(b);
    printf(" = ");
    if(flag) printFraction(ans);
    else printf("Inf");
    printf("\n");
}

int main()
{
    LL a1,b1,a2,b2;
    scanf("%lld/%lld %lld/%lld",&a1,&b1,&a2,&b2);
    Fraction a(a1,b1);
    Fraction b(a2,b2);
    showEquation(a,b,"add");
    showEquation(a,b,"sub");
    showEquation(a,b,"multiply");
    showEquation(a,b,"divide");
    ;
}

1088 Rational Arithmetic的更多相关文章

  1. PAT 1088 Rational Arithmetic[模拟分数的加减乘除][难]

    1088 Rational Arithmetic(20 分) For two rational numbers, your task is to implement the basic arithme ...

  2. 1088 Rational Arithmetic(20 分)

    For two rational numbers, your task is to implement the basic arithmetics, that is, to calculate the ...

  3. PAT 1088. Rational Arithmetic

    For two rational numbers, your task is to implement the basic arithmetics, that is, to calculate the ...

  4. PAT Advanced 1088 Rational Arithmetic (20) [数学问题-分数的四则运算]

    题目 For two rational numbers, your task is to implement the basic arithmetics, that is, to calculate ...

  5. PAT甲题题解-1088. Rational Arithmetic (20)-模拟分数计算

    输入为两个分数,让你计算+,-,*,\四种结果,并且输出对应的式子,分数要按带分数的格式k a/b输出如果为负数,则带分数两边要有括号如果除数为0,则式子中的结果输出Inf模拟题最好自己动手实现,考验 ...

  6. PAT (Advanced Level) 1088. Rational Arithmetic (20)

    简单题. 注意:读入的分数可能不是最简的.输出时也需要转换成最简. #include<cstdio> #include<cstring> #include<cmath&g ...

  7. 【PAT甲级】1088 Rational Arithmetic (20 分)

    题意: 输入两个分数(分子分母各为一个整数中间用'/'分隔),输出它们的四则运算表达式.小数需要用"("和")"括起来,分母为0的话输出"Inf&qu ...

  8. 1088. Rational Arithmetic (20)

    1.注意在数字和string转化过程中,需要考虑数字不是只有一位的,如300转为"300",一开始卡在里这里, 测试用例: 24/8 100/10 24/11 300/11 2.该 ...

  9. PAT1088:Rational Arithmetic

    1088. Rational Arithmetic (20) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue F ...

随机推荐

  1. 在js中,ajax放在for中,ajax获取得到的变量有误

    先看代码 for(var i=0;i<tds.length;i++){ mui.ajax(url+'api/client/gifts/isSigned', {data :{ sqId:" ...

  2. Redis 数据备份与恢复,安全,性能测试,客户端连接,管道技术,分区(四)

    Redis 数据备份与恢复 Redis SAVE 命令用于创建当前数据库的备份. 语法 redis Save 命令基本语法如下: redis 127.0.0.1:6379> SAVE 实例 re ...

  3. 【python】利用h5py存储数据

    两类容器:group & dataset group类似文件夹,字典. dataset是数据集,类似数组 支持更多的对外透明的存储特征,数据压缩,误差检测,分块传输 group下面可以是gro ...

  4. tf随笔-1

    生成新的计算图,并完成常量初始化,在新的计算 图中完成加法计算 import tensorflow as tf g1=tf.Graph() with g1.as_default(): value=[1 ...

  5. I-O流概念认知升级

    在文件操作基础入门中,我们提到了流的 概念,这篇我们将更多的介绍流这个东西,以及C的I/O相关知识 现在,我们从C程序员最熟悉的printf函数开始学习I/O流. 我们对printf函数一直是很喜爱的 ...

  6. Keras GRU 文字识别

    GRU(Gated Recurrent Unit)是LSTM的一个变体,也能克服RNN无法很好处理远距离依赖的问题. GRU的结构跟LSTM类似,不过增加了让三个门层也接收细胞状态的输入,是常用的LS ...

  7. SQl_case when

  8. postman安装Postman Interceptor 插件

    做后端开发避免不了进行接口调试,但是一般的项目都是前后端分离的,如果把前端代码下到本地,较为费事,这个时候就需要一个可以进行接口调试的工具.Postman就是一个不错的选择. Postman是什么? ...

  9. Bootstrap-table学习笔记(二)——前后端分页模糊查询

    在使用过程中,一边看文档一边做,遇到了一些困难的地方,在此记录一下,顺便做个总结: 1,前端分页 2,后端分页 3,模糊查询 前端分页相当简单,在我添加了2w条测试数据的时候打开的很流畅,没有卡顿. ...

  10. 排序算法总结(C#版)

    算法质量的衡量标准: 1:时间复杂度:分析关键字比较次数和记录的移动次数: 2:空间复杂度:需要的辅助内存: 3:稳定性:相同的关键字计算后,次序是否不变. 简单排序方法 .直接插入排序 直接插入排序 ...