思路
读字符串,先定义
0
1
\tfrac{0}{1}
10,转数字,不断通分,加
o
r
or
or减,再约分(反正字符长度不超过100对吧,很少,也很快。。),最后在特判一下,分母为1
o
r
or
or 负数的情况就好啦
代码
精炼冗长的代码
#include<bits/stdc++.h>
using namespace std;
string a;
int i=0;
int f(int x,int y){
if(x==0) return y;
else return f(y%x,x);
}
int g(int n){
int x=0;
while(a[n]>='0'&&a[n]<='9'){
x=x*10+a[n]-'0';
n++;
}
i=n;
return x;
}
int main(){
cin>>a;
int len=a.length();
int m=1,s=0;
int ss,mm;
while(i<len){
if(a[i]!='-'&&a[i]!='+'){//判断首位是加还是减
ss=g(i);
mm=g(i+1);
int y=f(min(mm,m),max(mm,m));
ss=ss*m/y;
m=mm*m/y;
s=s*mm/y+ss;
y=f(min(m,s),max(m,s));
if(y!=1){
m=m/y;
s=s/y;
}
}
else if(a[i]=='+'){
ss=g(i+1);
mm=g(i+1);
int y=f(min(mm,m),max(mm,m));
ss=ss*m/y;
m=mm*m/y;
s=s*mm/y+ss;
y=f(min(m,s),max(m,s));
if(y!=1){
m=m/y;
s=s/y;
}
}
else if(a[i]=='-'){
ss=g(i+1);
mm=g(i+1);
int y=f(min(mm,m),max(mm,m));
ss=ss*m/y;
m=mm*m/y;
s=s*mm/y-ss;
y=f(min(m,s),max(m,s));
if(y!=1){
m=m/y;
s=s/y;
}
}
}
if(m==1) cout<<s;
else{
if(m<0){
cout<<-s<<"/"<<-m;
}
else{
cout<<s<<"/"<<m;
}
}
return 0;
}