题意:

给出两个分式(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. HDFS集群启动的常见问题

    hdfs集群启动的常见问题 1.用浏览器访问namenode的50070端口,不正常,需要诊断问题出在哪里: a.在服务器的终端命令行使用jps查看相关进程 观察节点是否存活 b.如果已经知道了启动失 ...

  2. 从互信息的角度来理解tf-idf

    先介绍tf idf 在一份给定的文件里,词频(term frequency,tf)指的是某一个给定的词语在该文件中出现的频率.这个数字是对词数(term count)的归一化,以防止它偏向长的文件.( ...

  3. 【C#基本功】1》panel的C#用法 panel

    上面截图是panel在labview中的用法,在labview中panel加动态调用技术可以解决很多难题. 对于刚刚接触C#的我来说,如何实现pannel动态加载界面,也是一个必须首要克服的难点. 经 ...

  4. HttpClient for .NET 4.0

    Install-Package Microsoft.Net.Http -Version 2.2.29

  5. socket长连接和短链接区别

    短连接 连接->传输数据->关闭连接 HTTP是无状态的,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束后就中断连接.短连接是指SOCKET连接后发送后接收完数据后马上断 ...

  6. http Code含义

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

  7. 异步请求(ajax,http) 之 逐渐完善的大全

    异步请求在我们的开发之中是经常需要学习和理解的内容,我们将会在这一篇文章中依据不同的语言和环境内容进行归类讲解. JS: ajax是我们最为常用的页面异步请求,在只需要修改部分页面内容而不需要更换全部 ...

  8. TCPL学习笔记:4-12以及4-13。关于使用递归的问题。

    4-12.写一个函数itoa,通过递归调用将整数转换成为字符串. #include <stdio.h> #include <stdlib.h> void Itoa(int nu ...

  9. 使用LNMP环境安装typecho博客的全程记录

    虽然我是搞asp.net的 但是十分欣赏php,php有很多开源的博客程序 比如大名鼎鼎的Wordpress.还有各种独立博客大牛使用的z-blog,以及短小精悍的emblog. wordpress臃 ...

  10. hibernate的注解属性mappedBy详解【实际项目】

    [应用情节: 技术问答] 一个类是问题类 一个类是回答类 一个类是针对回答的讨论类 关系是一个问题对应多个答案   一个答案对应多个讨论 [三个类的注解关系] 问题类的 答案类的 讨论类的