洛谷 P1022 计算器的改良

来源:互联网 发布:苹果站电影源码 编辑:程序博客网 时间:2024/05/17 23:18
巨大的模拟(其实也比较小)。
等式左边的常数是减掉的,右边则加上,总体效果相当于把左边的常数移到右边去。
左边的字母系数加上,右边的减掉。总体是把右边的未知数移到左边来。
程序里面para是常数,cof是系数。change那个是串转数。
然后ans一除就好了。。

不过话说C++的setpercision不能保留末尾的0,调printf调了半天。。


#include<iostream>#include<cstdio>#include<iomanip>using namespace std;const bool l=false,r=true;string equal1;int cof,para,start;float ans;bool judge;char var;int change(int begin,int end){int i,beg=1,tmp=0;for(i=end; i>=begin; i--){tmp+=(equal1[i]-'0')*beg;beg*=10;}if(begin>0 && equal1[begin-1]=='-')tmp=-tmp;return tmp;}void read(){int i,j;std::ios::sync_with_stdio(false);cin>>equal1;judge=l;for(i=0; i<equal1.size(); i++)if(equal1[i]>='0' && equal1[i]<='9' && start==-1)start=i;else if(equal1[i]=='+' || equal1[i]=='-' || equal1[i]=='='){if(start==-1)continue;if(judge==l)para-=change(start,i-1);elsepara+=change(start,i-1);if(equal1[i]=='=')judge=r;start=-1;}else if(equal1[i]>='a' && equal1[i]<='z'){var=equal1[i];if(start==-1){if(judge==l)cof++;elsecof--;continue;}if(judge==l)cof+=change(start,i-1);elsecof-=change(start,i-1);start=-1;}if(start!=-1)para+=change(start,equal1.size()-1);ans=(float)para/(float)cof;printf("%c",var);printf("=");printf("%.3f",ans);return;}int main(){read();return 0;}


0 0