当前位置: 代码迷 >> 综合 >> 洛谷 P1022 计算器的改良
  详细解决方案

洛谷 P1022 计算器的改良

热度:96   发布时间:2023-12-06 08:19:23.0

题目:计算器的改良


思路:

把方程以=为界拆成两段,对于每一段假设前面没有 - 号,就添加一个 + 号,且每一段的结尾加一个 + 号。

再把两段的未知数系数和常数项合并,移项,化系数为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;
}