题面Link
此题太坑,好多好多的坑,具体请看代码吧。
本来在本地的lemon上测没过,但在luogu上测A了。
好了xs完了,于是上代码。
#include<bits/stdc++.h>
using namespace std;
char s[1010];
int Left[1010],Right[1010];
bool bjUKE[1010];
int lens;
char UKE=' ';
int jc(int x,int y)//函数算10的幂次方
{
int s=1;
for(int i=1;i<=y;i++)
{
s=s*10;
}
return s;
}
int main()
{
//freopen("calc.in","r",stdin);
//freopen("calc.out","w",stdout);
bool lbj=1;//用来判断是左边还是右边,左边为未知数的数量,右边为常数
int Rs=0,Ls=0;//Rs为右边的总和,Ls为左边的总和
while(cin>>s[++lens])//边输入边处理
{
if(s[lens]=='=')//如果遇到等号就换边
{
lbj=0;
continue;
}
else if(s[lens]>='a' && s[lens]<='z')//算左边的总和
{
if(UKE==' ') UKE=s[lens];
Left[0]++;
bjUKE[lens]=true;
if(s[lens-1]<='0' || s[lens-1]>='9')
{
Left[Left[0]]++;
}
else
{
for(int i=lens-1;i>=1;i--)
{
if(s[i]>='0' && s[i]<='9')
{
Left[Left[0]]+=int(s[i]-'0')*jc(10,lens-i-1);
bjUKE[i]=true;
}
else
{
if((s[i]=='-' && lbj==1) || (s[i]!='-' && lbj==0))//依然是要变号!!!(坑2)
{
Left[Left[0]]=Left[Left[0]]*(-1);
}
break;
}
}
}
Ls=Ls+Left[Left[0]];
}
}
lbj=1;//判断重定义
for(int i=1;i<=lens;i++)//计算右边的常数总和
{
if((s[i]=='+' || s[i]<='-' || s[i]=='=') && bjUKE[i]==false && bjUKE[i-1]==false)
{
Right[0]++;
for(int j=i-1;j>=0;j--)
{
if(s[j]>='0' && s[j]<='9')
{
Right[Right[0]]+=int(s[j]-'0')*jc(10,i-j-1);
}
else
{
if((s[j]=='-' && lbj==0) || (s[j]!='-' && lbj==1))//注意移项要变号!!!(坑2)
{
Right[Right[0]]=Right[Right[0]]*(-1);
}
break;
}
}
Rs=Rs+Right[Right[0]];
}
if(s[i]=='=')
{
lbj=0;
}
}
if(Rs==0 || Ls==0) cout<<UKE<<"=0.000";//判读除数为零的情况,防止RE!!!(坑2)
else
{
cout<<UKE<<"=";
printf("%.3lf",double(Rs*1.000/Ls*1.000));
}
return 0;
}