分数加减法

分数加减法

时间限制: 1000 ms  |  内存限制: 65535 KB
难度: 2
描述
编写一个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

注意:一个分数分子分母同除以它俩的最大公约数即得最简分数!!!

思路:首先要把两个分数化成分母相同的,不管怎样化都行(无论是以两个分母的最小公倍数为共同分母,还是直接让两个分母相乘乘,都行),只要分母变化后分子也作出相应的变化,然后两个分数进行运算(相加或相减),最后得到一个最终的分数,然后分子分母同除以分子与分母的最大公约数,都能得到最简公约数。

代码:

#include <bits/stdc++.h>
using namespace std;
int yueshu(int x,int y)
{
    int t,r;
    if(x<y)
    {t=x;x=y;y=t;}
    while(y!=0)
    {
        r=x%y;
        x=y;
        y=r;
    }
    return x;
}
//int yueshu(int a,int b){
//while(b^=a^=b^=a%=b);
//return a;
//}
int main()//一个分数分子分母同除以它俩的最大公约数即得最简分数
{
    int a,b,c,d,z,m,n;
    char o;
    while(~scanf("%d/%d%c%d/%d",&a,&b,&o,&c,&d))
    {
        if(o=='+')
        {
            z=a*d+c*b;
            m=b*d;
            if(z==0)
                cout<<"0"<<endl;
            else if(z==m)
                cout<<"1"<<endl;
            else
            {
            n=yueshu(fabs(z),m);
            z=z/n;
            m=m/n;
            if(m==1)
                cout<<z<<endl;
            else
            cout<<z<<"/"<<m<<endl;
            }
        }
        if(o=='-')
        {
            z=a*d-c*b;
            m=b*d;
            if(z==0)
                cout<<"0"<<endl;
            else if(z==m)
                cout<<"1"<<endl;
            else
            {
            n=yueshu(fabs(z),m);
            z=z/n;
            m=m/n;
            if(m==1)
                cout<<z<<endl;
            else
            cout<<z<<"/"<<m<<endl;
            }
        }
    }
    return 0;
}

注释的那几行是大佬写的一行就能求出来最大公约数的方法,看不懂惊讶

这个题思路还不是最难的地方,关键是有很多种特殊的情况需要考虑,很容易漏掉,而且每个情况之间的连接逻辑要搞清楚,不然还是会错,比如有好几个else,if啥的,而且放的位置还需要注意

现在把各个需要考虑出来的情况罗列如下:

1.分子等于0,则不用进入求最大公约数函数,直接单列出来,输出为0;

2.分子分母相等,也不用进入求最大公约数函数,直接输出为1;

3.分母等于1,直接输出分子,这个要注意,这种情况需要进入求最大公约数函数,而且不进是错误的,因为要考虑有些分数是在除以最大公约数后分母变为1的,这里很容易错。

4.注意输入如果想有“/”这个符号的话是按下面这样提前在scanf里写好的

  while(~scanf("%d/%d%c%d/%d",&a,&b,&o,&c,&d))

猜你喜欢

转载自blog.csdn.net/nanfengzhiwoxin/article/details/80098224
今日推荐