我个人想不出比较好的方法,可能我比较2,有的请大神指教下,以下是我的思路,不喜勿喷:
就是解方程,字母一边,数字一边,最后和在一起化简
code:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
char s[1001];
int l,i,k=1,j,flag1;char flag2;
float s1,cs,cv,cp,cd;
int main(){
cin>>s;
l=strlen(s);
for(i=0;i<l;i++)
if(s[i]=='='){flag1=i;break;}
for(i=l-1;i>=0;i--)
{k=1;
if(s[i]>='a'&& s[i]<='z')
{flag2=s[i];
if(i>flag1)
{j=i-1;
while(s[j]!='+' && s[j]!='-' && j>flag1){
s1-=(s[j]-'0')*k;
k*=10;
s[j]='0';
j--;
}
if(s[j]=='-')s1=abs(s1);
}
if(i<=flag1)
{j=i-1;
while(s[j]!='+' && s[j]!='-' && j>=0){
cd+=(s[j]-'0')*k;
k*=10;
s[j]='0';
j--;
}
}
if(s[j]=='-')s1-=cd;
else s1+=cd;
}
}
k=1;
for(i=flag1-1;i>=0;i--)
if(s[i]>='0'&& s[i]<='9')
{ j=i;k=1;cs=0;
while(s[j]!='+' && s[j]!='-' && j>=0)
{cs+=(s[j]-'0')*k;
k*=10;
j--;
}
i=j;
if(s[j]=='-')cs=0-cs;
cv+=cs;
}
for(i=l-1;i>flag1;i--)
if(s[i]>='0'&& s[i]<='9')
{ j=i;k=1;cs=0;
while(s[j]!='+' && s[j]!='-' && s[j]!='='&& j>flag1)
{cs+=(s[j]-'0')*k;
k*=10;
j--;
}
i=j;
if(s[j]=='-')cs=0-cs;
cp+=cs;
}
if(s1==0)s1=1;
cout<<flag2<<"=";
printf("%.3f",(cp-cv)/s1);
return 0;
}