题目:计算器的改良
思路:
把方程以=为界拆成两段,对于每一段假设前面没有 - 号,就添加一个 + 号,且每一段的结尾加一个 + 号。
再把两段的未知数系数和常数项合并,移项,化系数为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;
}