题意:
给出两个分式(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; }