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;
}