问题标题: 洛谷:P1022 计算器的改良

0
0

0
已采纳
邵逸儒
邵逸儒
中级天翼
中级天翼

主要思路说一下

首先 扫一遍 将方程变为kx=y的形式(y为常数)

至于怎么变会比较麻烦

遇到“+,-或第一个或等号后一个”

判断记录它后面的数

如果再后面是字母

就把num加进一次项系数中

k1是=左边的系数,k2是右边的

如果等于号出现过就加进k2,没有就加进k1

如果不是字母

加进(左边和或右边和)(sumleft sumright)

最后 得到 k1X+sumleft=k2X+sumright

解得 X=(sumright-sumleft)/(k1-k2)

0
赵逸凡
赵逸凡
初级启示者
初级启示者
int main(){
    char c=getchar();//为了节省空间当然要在线 
    ll cur=0,sign=1; bool value_gotten=false;//cur为当前读入的数值,sign表示当前数值符号,value_gotten是一个标记变量,字面意思是是否读入过数值,用途下面说 
    while (true){
        if (c>='a' && c<='z'){
            x=c; if (cur==0 && !value_gotten) coe+=opp*sign,value_gotten=false; //这也是个坑点(虽然数据没有涉及),如果cur为0又读入了变量名称有两种情况:一时+0x或-0x,另一种是默认系数为1,value_gotten专门判断这两种情况 
            else coe+=opp*sign*cur,cur=0,sign=1,value_gotten=false;
        }
        else if (c=='-') value+=-opp*sign*cur,cur=0,sign=-1,value_gotten=false;//如果是减号把当前数值加入值(如果之前是变量则当前数值为0,加入也没有影响),并清空当前数值,设value_gotten为false,符号修改为负 
        else if (c=='+') value+=-opp*sign*cur,cur=0,sign=1,value_gotten=false;//加号和减号一样,只是把符号修改为正 
        else if (c>='0' && c<='9') cur=cur*10+c-'0',value_gotten=true;//如果是数字,就对cur进行计算,并把value_gotten设为true 
        else if (c=='=') value+=-opp*sign*cur,cur=0,sign=1,opp=-opp,value_gotten=false;//等号和加减号差不多,只是要把opp设为负 
        else {value+=-opp*sign*cur;break;}//最后的值累加上去 
        c=getchar();
    }
    ans=double(value)/coe;//计算ans 
    printf("%c=%.3lf",x,ans==0?abs(ans):ans);//这涉及一个很坑的地方:C++里0除以一个负数值为-0,专门避免这种情况 

此为非完整代码

0
0
0
我要回答