分数加减法

xiaoxiao2021-02-28  70

分数加减法

时间限制: 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))
转载请注明原文地址: https://www.6miu.com/read-2250291.html

最新回复(0)