题意:

给出两个分式(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");
    ;
}

最新文章

  1. MySQL排序原理与案例分析
  2. oracle从零开始学习笔记 二
  3. Intel&#174; Threading Building Blocks (Intel&#174; TBB) Developer Guide 中文 Parallelizing Data Flow and Dependence Graphs并行化data flow和依赖图
  4. mac添加环境变量
  5. 转:CWnd的函数,以后可以在这儿找了!
  6. Android SDK Manager无法更新,内容显示不全的解决办法
  7. webView、scrollView、TableView,为了防止滚动时出现偏移,底部黑框问题等
  8. Java运行系统命令并获取值(Process java.lang.Runtime.exec(String[] cmdarray, String[] envp, File dir)
  9. WEB标准:标准定义、好处、名词解释、常用术语、命名习惯、浏览器兼容、代码书写规范
  10. 英伟达CUVID硬解,并通过FFmpeg读取文件
  11. !终端伪装测试之fuck校园网
  12. 如何把word中的图片怎么导出来呢?
  13. django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3.
  14. 两种方法上传本地文件到github(转)
  15. P1516 青蛙的约会
  16. mysql自动更新时间
  17. node微信公众号开发---自动回复
  18. HDFS 总结
  19. TFS 2015 生成不输出任何结果
  20. jmeter乱码问题

热门文章

  1. JNI_Z_04_属性的操作(非String类型的属性)
  2. SDWebImage支持URL不变时更新图片内容
  3. LeetCode第[62]题(Java):Unique Paths 及扩展
  4. 今夜我们一起学习 Apache Shiro
  5. poj3311 状压dp+floyd
  6. XMLHttpRequest Level2
  7. 记录下工作中使用的pdf.js
  8. 持久层框架:MyBatis 3.2(2)
  9. 日常生活小技巧 -- 惠普 Windows10 进入安全模式
  10. canvas 创建颜色渐变柱状图