/*编写一个C程序,实现两个分数的加减法
输入
输入包含多行数据
每行数据是一个字符串,格式是"a/boc/d"。
其中a, b, c, d是一个0-9的整数。o是运算符"+"或者"-"。
数据以EOF结束
输入数据保证合法
输出
对于输入数据的每一行输出两个分数的运算结果。
注意结果应符合书写习惯,没有多余的符号、分子、分母,并且化简至最简分数
样例输入
1/8+3/8
1/4-1/2
1/3-1/3
样例输出
1/2
-1/4
0
*/
//因为nyoj上的测试数据不会有分母为0的,所以分母为0,无需考虑。
#include<stdio.h>
int abs(int x)
{
return x>0?x:(-x);
}
int main()
{
int a,b,c,d,e,f;
int m,n,t;
char q,o;
while(scanf("%d/%d%c%d/%d",&a,&b,&o,&c,&d)!=EOF)//读取 数据,将其中的加号或减号存入字符o 中。
{
if(a==0&&c==0)//当第一个分子和第二个分子同时为0,则结果为0。
printf("0\n");
else if(a==0)//当输入的第一个分子等于0,不需进行运算,直接输出符号和最后一个分数即可
{
if(o=='-')//因为输出结果不能含有'+',当o是'-'时才输出该符号.
printf("%c%d/%d\n",o,c,d);
else
printf("%d/%d\n",c,d);
}
else if(c==0)//如果第二个分子为0,无需运算,直接输出第一个分数即可。
printf("%d/%d\n",a,b);
else//当两个分数的分子都不为0时,进行以下运算。
{
if(o=='+')
e=a*d+b*c;//e用来储存通分后的分子
if(o=='-')
e=a*d-b*c;//e用来储存通分后的分子
if(e==0)//如果通分后分子为0,则结果为0。
printf("0\n");
else
{
f=b*d;//f用来储存通分后的分母
m=f;//保留数据f
n=abs(e);
if(m>n)///求出分子与分母的最大公约数
{
t=m;m=n;n=t;
}
while(m!=0)
{
if(n%m==0)
break;
t=n%m;
n=m;
m=t;
}
if(f==m)//如果最大公约数就是f,那么结果就是一个整数,即:e/m。
printf("%d\n",e/m);
else
printf("%d/%d\n",e/m,f/m);//分子和分母同时除以最大公约数,约分。
}
}
}
return 0;
}