题意:

给出两个分式(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. DP问题如何确定状态

    DP问题如何确定状态 一.dp实质 动态规划的实质就是通过小规模的同类型的问题来解决题目的问题. 所以有一个dp数组来储存所有小规模问题的解. 所以确定状态也就是缩小问题规模. 我们求解问题的一般规律 ...

  2. Ajax-07 基于Ajax实现跨域请求

    跨域 跨域名访问,如c1.com域名向c2.com域名发送请求 本质:浏览器存在同源策略机制,同源策略阻止从一个源加载的文档或脚本获取或设置另一个源加载的文档的属性. django服务端准备 url. ...

  3. http Code含义

    5xx - 服务器错误 服务器由于遇到错误而不能完成该请求.

  4. urllib.urlretrieve远程下载

    下面我们再来看看 urllib 模块提供的 urlretrieve() 函数.urlretrieve() 方法直接将远程数据下载到本地. >>> help(urllib.urlret ...

  5. MongoCola使用教程 1 - MongoDB的基本操作和聚合功能---Mongdb客户端软件操作说明

    前言 在开始正文之前,感谢博客园的Nosql爱好者对于MongoCola工具的试用(使用).特别感谢 呆呆 这位朋友的Bug报告,让我纠正了一个很严重的Bug.同时也感谢以前的多个网友在博客留言中给我 ...

  6. 条款22:将成员变量声明为private

    protected成员变量的封装性并非高于public变量. 如果有个public的成员变量,一旦其需要改变,那么所有使用它的代码都需要改变. 如果有个protected的成员变量,一点其需要改变,那 ...

  7. mcake活动维护,检查 ★ ★

    一.检查火狐浏览器.chrome浏览器.ie8.9.10.11是否显示正常 二.对比设计稿 三.动画添加 四.检查图片是否失真 五.ie8空按钮无法点击 六.官网banner制作

  8. New Concept English three (41)

    31w/m   The typing speed need to improved 43errors The quiet life of the country ahs never appealed ...

  9. Lua基础---lua字符串库函数详解,实例及正则表达式

    参考这个网友写的,比较简单容易理解. http://blog.csdn.net/wlgy123/article/details/49206183

  10. Scikit-Learn:开源的机器学习Python模块(转载)

    摘要: scikit-learn是一个用于机器学习的Python模块,其具有操作简单.效率高.无访问限制.BSD开源协议等等特征,在机器学习这一块是比较受欢迎的. scikit-learn是一个用于机 ...