分数计算
从键盘读入一个分数算式,为2个分数做加法或者减法,请输出分数算式的结果,结果也用分数表达,且约分到最简形式。(请注意:做减法可能得到负的分数,如果是负数要输出负号-,如1/15-4/15结果为-1/5)。
这道题真的很有意思!
值得一做,可以先用find和rfind这两个函数求出这四个数
在转化成整数计算,注意,一个数约分后另一个数就不能直接在用变过的数带入函数
还有,你们的程序怎么那么长?
//(water problem)
#include<bits/stdc++.h>
//#pragma GCC optimize (3)
using namespace std;
int G(int a,int b){if(b==0) return a;else return G(b,a%b);}
int L(int n,int m){if(n*m==0) return 0;else return (n*m)/G(n,m);}
int main()
{
string s;cin>>s;int l=s.size();int f1=0,f2=0,f3=0,f4=0;
int p1=s.find('/');for(register int i=0;i<p1;i++) f1=f1*10+s[i]-'0';
int p2=s.find('+');if(p2==-1) p2=s.find('-');for(register int i=p1+1;i<p2;i++) f2=f2*10+s[i]-'0';
int p3=s.rfind('/');for(register int i=p2+1;i<p3;i++) f3=f3*10+s[i]-'0';
for(register int i=p3+1;i<l;i++) f4=f4*10+s[i]-'0'; //到此,我们求出了四个数
int d=L(f2,f4);int k1=d/f2,k2=d/f4;f1*=k1,f2*=k2;
if(f1-f3==0) cout<<0;
else{
if(f1<f2 && s.find('-')!=-1 && f2-f1!=0){cout<<'-';swap(f1,f3);}p2=s.find('-');
if(p2==-1){int x1,x2;x1=f1+f3,x2=f4;int p=x2;x2/=G(x1,x2);x1=x1/G(x1,p);if(x2==1) cout<<x1;else cout<<x1<<'/'<<x2;}
else{int x1,x2;x1=f1-f3,x2=f4;int p=x2;x2/=G(x2,x1);x1/=G(x1,p);if(x2==1) cout<<x1;else cout<<x1<<'/'<<x2;}
}
return 0;
}