这道题目当时真的想了好久,死都想不出来为什么错了
(可能是我太菜了吧QAQ)
上题目吧


微信图片_20181126224016.png
微信图片_20181126224036.png


那么这题坑点主要有两个:
1.可能有+0x或者-0x这样的坑;
2.C++的double型会出现+0和-0的区别 (你没在逗我?)
第二个坑确实让我长知识了(利用这个坑出题人也是……)

那么,此题代码如下
(才不会告诉你我懒得改代码直接抄题解)

#include <bits/stdc++.h> 
using namespace std;

typedef long long ll;

char x; ll coe,value,opp=1;
//coe表示系数,value表示值,opp表示在等号左边还是右边 
double ans;

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,专门避免这种情况 
    
    return 0;
    

}
最后修改:2018 年 12 月 06 日
如果觉得我的文章对你有用,请随意赞赏