分数加减法
时间限制:
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))