题目描述
计算机中采用浮点数表示所有实数,但这意味着精度丢失。例如无法精确表示“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/6
1/2
- 分子分母的约分涉及最大公约数和最小公倍数问题
代码:
#include<iostream>
using namespace std;
int gcd(int x,int y){//辗转相除法求最大公约数
if(x%y==0) return y;
return gcd(y,x%y);
}
int main(){
int nom1, nom2, den1, den2,
den, newNom1, newNom2,
tmpNom, tmpDen, tmpGcd,
resNom, resDen;
char op;
while (~scanf("%d/%d%d/%d %c", &nom1, &den1,&nom2,&den2,&op))
{
den = den1*den2 / gcd(den1, den2);//求最小公倍数
newNom1 = nom1*den / den1;
newNom2 = nom2*den / den2;
switch (op)
{
case '+':
tmpNom = newNom1 + newNom2;
tmpDen = den;
break;
case '-':
tmpNom = newNom1 - newNom2;
tmpDen = den;
break;
case '*':
tmpNom = nom1*nom2;
tmpDen = den1*den2;
break;
case '/':
tmpNom = nom1*den2;
tmpDen = den1*nom2;
break;
}
tmpGcd = gcd(tmpNom, tmpDen);
resNom = tmpNom / tmpGcd;
resDen = tmpDen / tmpGcd;
resNom = resNom*resDen < 0 ? -abs(resNom) : abs(resNom);//注意符号问题
resDen = abs(resDen);
printf("%d/%d\n",resNom,resDen);
}
return 0;
}