题目:计算器的改良
思路:
把方程以=为界拆成两段,对于每一段假设前面没有 - 号,就添加一个 + 号,且每一段的结尾加一个 + 号。
再把两段的未知数系数和常数项合并,移项,化系数为1求得。
注意当常数项为0时要特殊处理,避免出现精度问题。
代码:
#include<bits/stdc++.h>
using namespace std;string a;
int n;
int ssum=0,sk=0;void readin(){cin>>a;if(a[0]!='-') a='+'+a;a+='+';
}int cut(){int c=a.find('=');if(a[c+1]!='-') {string x=a.substr(0,c+1),y=a.substr(c+1,n-x.size());a=x+'+'+y;}a[c]='+';
// cout<<a<<endl;n=a.size();return c;
}bool isnum(char x){if('0'<=x&&x<='9') return true;return false;
}void find(int l,int r){int sum=0,k=0;int num=0,opr;for(int i=l;i<=r;i++){if(a[i]=='+'){if(i-1>=0&&isnum(a[i-1])) {sum+=opr*num,num=0;}opr=1;}else if(a[i]=='-'){if(i-1>=0&&isnum(a[i-1])) {sum+=opr*num,num=0;}opr=-1;}else if(isnum(a[i])){num=num*10+a[i]-'0';}else if(isalpha(a[i])){if(!isnum(a[i-1])) num=1;k+=opr*num;num=0;}
// cout<<i<<' '<<a[i]<<" "<<num<<' '<<opr<<" "<<sum<<' '<<k<<endl;}
// cout<<sum<<' '<<k<<endl;if(l==0) ssum-=sum,sk+=k;else ssum+=sum,sk-=k;
}void print(){char d;for(int i=0;i<n;i++) {if(isalpha(a[i])) d=a[i];}if(ssum==0) {printf("%c=0.000\n",d);return ;}double x=ssum,y=sk;printf("%c=%.3lf",d,x/y);
}int main(){readin();int c=cut();find(0,c);find(c+1,n-1);print();return 0;
}