1.题目描述
计算机中采用浮点数表示所有实数,但这意味着精度丢失。例如无法精确表示“1/3”。
NowCoder最近要处理很多金融问题,这些账目不允许出现精度丢失,因为差之毫厘谬之千里。你能帮他实现一套分数的计算器吗?
2.输入描述:
输入包含多组数据。
每组数据一行,包含两个分数和一个运算符,中间用空格隔开。
其中分子与分母均为不大于30的正整数。
3.输出描述:
对应每一组数据,输出两个分数的计算结果。
要求输出最简分数,即分子与分母互质。
4.输入例子:
1/3 2/3 +
1/5 1/4 -
1/2 1/3 *
2/3 4/3 /
5.输出例子:
1/1
-1/20
1/6
1/2
6.解题思路:
分数运算共有加减乘除四种运算
<mark>加法</mark>:结果的分子=分子分母交叉相乘的和,结果的分母:分母相乘
<mark>减法</mark>:结果的分子=分子分母交叉相乘的差,结果的分母:分母相乘
<mark>乘法</mark>:结果的分子=分子相乘,结果的分母:分母相乘
<mark>除法</mark>:结果的分子:分子乘以另一个分母,结果的分母:另一个分子乘以分母
四种运算都会得出未化简的结果,所以下一步是化简
化简:求出分子分母的最大公约正整数(<mark>因为要考虑分母不能为负数</mark>)
最后我们要考虑的是<mark>除法</mark>:
如果分母为负数,最大公约数为正数,我们化简得还是分母为负数,所以我们还需要为除法另外加一个判断(见代码)。
7.源代码:
#include<stdio.h>
int gcd(int x,int y)
{
return !y? x>0?x:-x:gcd(y,x%y);
}
int main()
{
int a1,b1,a2,b2;
char c;
while(scanf("%d/%d %d/%d %c",&a1,&b1,&a2,&b2,&c)!=-1)
{
int A,B,C;
switch(c)
{
case '+':
A=a1*b2+a2*b1;
B=b1*b2;
C=gcd(A,B);
printf("%d/%d\n",A/C,B/C);
break;
case '-':
A=a1*b2-a2*b1;
B=b1*b2;
C=gcd(A,B);
printf("%d/%d\n",A/C,B/C);
break;
case '*':
A=a1*a2;
B=b1*b2;
C=gcd(A,B);
printf("%d/%d\n",A/C,B/C);
break;
case '/':
A=a1*b2;
B=a2*b1;
C=gcd(A,B);
B<0?printf("%d/%d\n",-A/C,-B/C):printf("%d/%d\n",A/C,B/C);
break;
default:break;
}
}
return 0;
}