两个分数的加减法(1004)

杭电 http://acm.hdu.edu.cn/webcontest/contest_login.php?cid=12226 密码 acm000

Problem  Description:

编写一个C程序,实现两个分数的加减法

Input:

输入包含多行数据 <br>每行数据是一个字符串,格式是"a/boc/d"。 <br> <br>其中a, b, c, d是一个0-9的整数。o是运算符"+"或者"-"。 <br> <br>数据以EOF结束 <br>输入数据保证合法

Output:

对于输入数据的每一行输出两个分数的运算结果。 <br>注意结果应符合书写习惯,没有多余的符号、分子、分母,并且化简至最简分数

Sample Input:

1/8+3/8
1/4-1/2

1/3-1/3

Sample Output:

1/2
-1/4

0

注意:这道题的主要问题在于不知道算出来的分数是否为最简式,这里就用到了我们之前写到的关于两个数的最大公约数,即判断出分子和分母的最大公约数,然后分子分母都除以这个最大公约数,最后得到的结果就是这个分数的最简分数。

My  DaiMa:

#include<stdio.h>
#include<math.h>
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<n)
            {
                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;
}

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-18 12:01
点赞 评论 收藏
分享
05-29 09:02
门头沟学院 Java
点赞 评论 收藏
分享
07-11 22:27
中南大学 Java
程序员牛肉:学历的话没问题。但是没问题的也就只有学历了。 其实你的整体架构是正确的,博客接着干。但是项目有点过于简单了。从后端的角度上讲,你这也就是刚入门的水平,所以肯定约面试够呛。 如果你要应聘后端岗位,那你第一个项目竟然是仿写操作系统。这个你要面试官咋问你。你一定要记住一点,你简历上写的所有的东西,都是为了证明你有能力胜任当前的岗位,而不是为了证明你自己会什么。 如果你只是浅浅的做几个项目,描述也都是烂大街。技术点也都是各种混水类的配置类需求,那你就不要幻想自己能走多远。一定要保持思考,保持学习。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务