从键盘读入一个分数算式,为2个分数做加法或者减法,请输出分数算式的结果,结果也用分数表达,且约分到最简形式。(请注意:做减法可能得到负的分数,如果是负数要输出负号-,如1/15-4/15结果为-1/5)(5.1.76)
输入格式
分数表达式(分数表达式中,每个分数的分子和分母都是正整数,两个分数中的运算符,可能是加号,也可能是减号,且分数表达式不含空格)
输出格式
分数表达式计算的结果
样例
输入数据 1
1/12+5/12
输出数据 1
1/2
提示
注意考虑特殊情况,如:1/2+1/2=1,1/2-1/2=0,这些情况下结果不需要表现为分数形式。
#include<bits/stdc++.h>
using namespace std;
string n , m = "" , k = "" , l , f;
int mlenf;
int bh(string a)//把字符串转成数字
{int ans=0;for(int i=0;i<a.size();i++){ans=ans*10+(a[i]-'0');}return ans;
}
int main(){getline(cin , n , '/');getline(cin , f , '/');int len = f.size();for(int i = 0;i < len;i++){if(f[ i ] == '+' || f[ i ] == '-')break;m += f[i];mlenf = i;}for(int i = mlenf+2;i < len;i++){k += f[i];}getline(cin,l,'\n');if(f[mlenf+1]=='-'){int z1=bh(n);int z2=bh(k);int m1=bh(m);int m2=bh(l);int y=z1*m2-z2*m1,t=m1*m2;//十字交叉if(y==0)cout<<"0";else{for(int i=10000;i!=0;i--)//约分{ if(y%i==0&&t%i==0){y/=i,t/=i;break;}if(t%y==0){t/=y,y=1;break;}}if(t==1)cout<<y;else if(t<0)cout<<'-'<<y<<"/"<<abs(t);else cout<<y<<"/"<<t;}}else{int z1=bh(n);int z2=bh(k);int m1=bh(m);int m2=bh(l);int y=z1*m2+z2*m1,t=m1*m2;if(y==0)cout<<"0";else{for(int i=10000;i!=0;i--){ if(y%i==0&&t%i==0){y/=i,t/=i;break;}if(t%y==0){t/=y,y=1;break;}}if(t==1)cout<<y;else if(t<0)cout<<'-'<<y<<"/"<<abs(t);else cout<<y<<"/"<<t;}}return 0;
}