两个分数的加减法(1004)

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

你可能感兴趣的:(easy)