这道题可以当做一个大的模拟题,难度应该是普及-,
思路:用vector v1保存分子,vector v2保存分母 vector v3保存符号 (+ -)然后求出 分母的最小公倍数
s v1分子乘以 s/v2对应的分母 然后 v1里根据v3的符号进行加加减减 最后得到res 再对res 与 s 求最大公约数 gd 然后分子分母同时除以 gd 就是最后结果了
踩坑点:(1)分母为1 不用输出 /1 输出f分子即可
(2)求最大公约数要用他们的绝对值来求
下面是Accode:
#include <iostream>
#include <vector>
using namespace std;
string str;
int trans(int &i);
int lcm(int a,int b);// 求最小公倍数
int gcd(int a,int b); //最大公倍数
vector<int > v1,v2; // v1存储分子 v2存储分母 v3存储+ -符号
vector<char > v3;
int main()
{
cin>>str;
for(int i=0;i<str.length();i++)
{
int num=trans(i);
if(i<str.length()&&str[i]=='/')
{
v1.push_back(num);
}
else
{
v2.push_back(num);
if(i<str.length())
{
v3.push_back(str[i]);
}
}
}
int lm=1;
//求分母的最小公倍数
for(vector<int>::iterator it=v2.begin();it!=v2.end();it++)
{
lm=lcm(lm,*it);
}
for(int i=0;i<v1.size();i++)
{
v1[i]=v1[i]*(lm/v2[i]);
}
int res=v1[0]; //res1是分子
for(int i=1;i<v1.size();i++)
{
if(v3[i-1]=='+')
{
res+=v1[i];
}
else
{
res-=v1[i];
}
}
int gd=gcd(abs(res),abs(lm));
int t1=res/gd;
int t2=lm/gd;
if(t1*t2>0)
{
if(t2==1)
{
cout<<t1;
}
else
{
cout<<t1<<"/"<<t2<<endl;
}
}
else
{
if(abs(t2)==1)
{
cout<<"-"<<abs(t1)<<endl;
}
else
{
cout<<"-"<<abs(t1)<<"/"<<abs(t2);
}
}
return 0;
}
int trans(int &i)
{
int res=0;
while(i<str.length()&&str[i]!='/'&&str[i]!='+'&&str[i]!='-')
{
res=res*10+str[i]-'0';
i++;
}
return res;
}
int lcm(int a,int b) // 求最小公倍数
{
if(a <b)
{
int t=a;
a=b;
b=t;
}
int t=a;
while(a%b!=0)
{
a=a+t;
}
return a;
}
int gcd(int a,int b) //最大公倍数
{
if(a<b)
{
int t=a;
a=b;
b=t;
}
int r=a%b;
while(r!=0)
{
a=b;
b=r;
r=a%b;
}
return b;//返回最大公约数
}