这个题,很多细节需要处理。 思路比较简单讲=号两边的 算式 整理为 ax+b=cx+d 的形式,这样再来计算; 总体来说难度不大。 记得结果为负号并且是浮点数的时候,与正数不一样; 比如 3x= -4 结果是-2 ; 而不是-1; 代码如下:
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
void Fun(string s,int &a, int &b )
{
int tag[300]={0},k=0,flag,sum,t=0;
for(int i=0;i<s.length();i++)
{
if(s[i]=='x')
{
tag[i]=1;
if(i==0) a++;
else if(s[i-1]=='+') {a++;tag[i-1]=1;}
else if(s[i-1]=='-'){a--;tag[i-1]=1;}
else
{
sum=0;flag=0;
for(int j =i-1;j>=0;j--)
{
tag[j]=1;
if(s[j]=='+') { a+=sum;flag=1;break;}
if(s[j]=='-'){a-=sum;flag=1;break;}
else
sum+= (s[j]-'0')*pow(10.0,i-j-1);
}
if(flag==0) a+=sum;
}
}
}
char str[300];
for(int i=0;i<s.length();i++)
{
if(tag[i])continue;
str[k++]=s[i];
if(s[i]=='+'||s[i]=='-') t=1;
}
str[k]='\0';flag=0;
if(!t) {if(k>0) for(int i=0;i<k;i++) b+=(str[i]-'0')*pow(10.0,k-i-1);}
else {
for(int i=0;i<k;i++)
{
if((str[i]=='+'||str[i]=='-'||i==k-1)&&i)
{
sum=0;
int j=i-1;
if(i==k-1) j++;
for(;j>=0;j--)
{
if(str[j]=='+') { b+=sum;flag=1;break;}
if(str[j]=='-') { b-=sum;flag=1;break;}
else
{int m=i-j-1;if(i==k-1) m++;sum+= (str[j]-'0')*pow(10.0,m);}
}
if(flag==0) b+=sum;
}
}
}
}
int main()
{
string str;
int cases;
cin>>cases;
while(cases--)
{
cin>>str;
int a=0,b=0,c=0,d=0;
int t;
for(t=0;t<str.length();t++)
if(str[t]=='=') break;
string str1=str.substr(0,t);
string str2=str.substr(t+1,str.length()-t);
Fun(str1,a,b);
Fun(str2,c,d);
a=a-c;b=d-b;
if(a==0&&b) cout<<"IMPOSSIBLE\n";
else if(a==0&&b==0) cout<<"IDENTITY\n";
else if(b/a<0&&(b/a)>(b*1.0/a)) cout<<b/a-1<<endl;
else cout<<b/a<<endl;
}
}