杭电 http://acm.hdu.edu.cn/webcontest/contest_login.php?cid=12226 密码 acm000
Problem Description:
编写一个C程序,实现两个分数的加减法
Input:
输入包含多行数据
每行数据是一个字符串,格式是"a/boc/d"。
其中a, b, c, d是一个0-9的整数。o是运算符"+"或者"-"。
数据以EOF结束
输入数据保证合法
Output:
对于输入数据的每一行输出两个分数的运算结果。
注意结果应符合书写习惯,没有多余的符号、分子、分母,并且化简至最简分数
Sample Input:
1/8+3/8
1/4-1/2
1/3-1/3
Sample Output:
1/2
-1/4
0
注意:这道题的主要问题在于不知道算出来的分数是否为最简式,这里就用到了我们之前写到的关于两个数的最大公约数,即判断出分子和分母的最大公约数,然后分子分母都除以这个最大公约数,最后得到的结果就是这个分数的最简分数。
My DaiMa:
#include
#include
int main()
{
int j,m,n,x,y;
char c[7];
while(~scanf("%s",c))
{
if(c[2]==c[6])
{
m=c[2]-'0';
if(c[3]=='+')
n=(c[0]-'0')+(c[4]-'0');
else
n=(c[0]-'0')-(c[4]-'0');
}
else
{
m=(c[2]-'0')*(c[6]-'0'); //将分母都化成相同的数,最后再统一化简
c[0]=(c[0]-'0')*(c[6]-'0'); //同时分子也需要变
c[4]=(c[4]-'0')*(c[2]-'0');
if(c[3]=='+')
n=c[0]+c[4];
else
n=c[0]-c[4];
}
if(n==0) //这是结果为0的情况,只要分子是0,最后结果就是0
printf("0\n");
else if(n%m==0) //这是例如(1/2+1/2=1)等结果是整数的情况
printf("%d\n",n/m);
else //另外的都是一些化简和不化简的情况
{
x=m; //分母都是正的,因为参与运算的是分子
y=n; //若分数为负,最后的负号也是在分子上,不会影响输出结果
n=fabs(n);
if(m
j=m;
m=n;
n=j;
}
j=n;
while(m%n) //这就是判断出分子分母的最大公约数的方法
{
j=m%n;
m=n;
n=j;
}
printf("%d/%d\n",y/j,x/j); //最后分子分母都除以最大公约数 结果就是最简分数
}
}
return 0;
}