题目描述
计算机中采用浮点数表示所有实数,但这意味着精度丢失。例如无法精确表示“1/3”。 NowCoder最近要处理很多金融问题,这些账目不允许出现精度丢失,因为差之毫厘谬之千里。你能帮他实现一套分数的计算器吗?
输入描述:
输入包含多组数据。 每组数据一行,包含两个分数和一个运算符,中间用空格隔开。 其中分子与分母均为不大于30的正整数。
输出描述:
对应每一组数据,输出两个分数的计算结果。 要求输出最简分数,即分子与分母互质。
输入例子:
1/3 2/3 + 1/5 1/4 - 1/2 1/3 * 2/3 4/3 /
输出例子:
1/1 -1/20 1/61/2
#include <cstdio> #include <algorithm> using namespace std; struct Fraction{ int up,down; }a,b; int gcd(int a,int b){ return !b?a:gcd(b,a%b); } Fraction reduction(Fraction r){ if(r.down<0){ r.up=-r.up; r.down=-r.down; } if(r.up==0) r.down=1; else{ int d=gcd(abs(r.up),abs(r.down)); r.up/=d; r.down/=d; } return r; } Fraction add(Fraction f1,Fraction f2){ Fraction r; r.up=f1.up*f2.down+f2.up*f1.down; r.down=f1.down*f2.down; return reduction(r); } Fraction sub(Fraction f1,Fraction f2){ Fraction r; r.up=f1.up*f2.down-f2.up*f1.down; r.down=f1.down*f2.down; return reduction(r); } Fraction multi(Fraction f1,Fraction f2){ Fraction r; r.up=f1.up*f2.up; r.down=f1.down*f2.down; return reduction(r); } Fraction divide(Fraction f1,Fraction f2){ Fraction r; r.up=f1.up*f2.down; r.down=f1.down*f2.up; return reduction(r); } void showResult(Fraction r){ printf("%d/%d\n",r.up,r.down); } int main(){ char c; while(scanf("%d/%d %d/%d %c",&a.up,&a.down,&b.up,&b.down,&c)!=EOF){ if(c=='+') showResult(add(a,b)); else if(c=='-') showResult(sub(a,b)); else if(c=='*') showResult(multi(a,b)); else if(c=='/') showResult(divide(a,b)); } return 0; }