1088 Rational Arithmetic

题意:

给出两个分式(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(0),down(1){}//默认初始化
    Fraction(int up_,int down_):up(up_),down(down_){}
};

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

//分数化简
void simplify(Fraction& a){
    if(a.down<0) {
        a.down = -a.down;
        a.up = -a.up;
    }
    if(a.up==0){
        a.down=1;
    }else{
        int commonFractor=gcd(abs(a.up), abs(a.down));//注意要加绝对值!!!
        a.up/=commonFractor;
        a.down/=commonFractor;
    }
}
//打印分数 void printFraction(Fraction a){ simplify(a); if(a.up<0) printf("("); if(a.down==1) 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); } if(a.up<0) 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); if(strcmp(op,"add")==0){ printf(" + "); ans=add(a,b); }else if(strcmp(op,"sub")==0){ printf(" - "); ans=sub(a,b); }else if(strcmp(op,"multiply")==0){ printf(" * "); ans=multiply(a,b); }else { printf(" / "); if(b.up==0) 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"); return 0; }

 

转载于:https://www.cnblogs.com/kkmjy/p/9533585.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值