usingnamespacestd;usingi32=int32_tusingu32=uint32_t;/*************************************************************************************************/i32eval_midexpr(string_viewexpr){// this method reinterprets the input into a expression with no brackets.autoget_next=[ptr=expr.data(),ed=expr.data()+expr.size(),implicit_mul=false]()mutable{optional<variant<i32,char>>ret;if(ptr!=ed){if(*ptr=='('){if(implicit_mul){implicit_mul=false;ret='*';}else{implicit_mul=true;autoi=ptr;for(u32cnt=1;cnt;){if(*++i=='('){++cnt;}elseif(*i==')'){--cnt;}}ret=eval_midexpr({ptr+1,(size_t)(i-ptr)-1});ptr=i+1;}}elseif(*ptr=='*'||*ptr=='/'){implicit_mul=false;ret=*ptr++;}else{implicit_mul=true;autoconsthead=*ptr;if(head=='+'||head=='-'){++ptr;}i32num=0;while('0'<=*ptr&&*ptr<='9'){num=num*10+*ptr++-'0';}ret=head=='+'?num?num:1:head=='-'?num?-num:-1:num;}}// 也可以去掉上面内联的 flag 设置,在最后统一地写一句这个:// implicit_mul = ret && holds_alternative<i32>(ret.value());returnret;};vector<i32>buf;for(decltype(get_next())i;i=get_next();){if(holds_alternative<i32>(*i)){buf.push_back(get<i32>(*i));}else{// When buf.size() == 1, adds a dummy 0 in the front.autolhs=buf.back();autoacc=accumulate(begin(buf),prev(end(buf)),(i32)0);buf.resize(2);buf[0]=acc;if(get<char>(*i)=='*'){buf[1]=lhs*get<i32>(*get_next());}else{buf[1]=lhs/get<i32>(*get_next());}}}returnaccumulate(begin(buf),end(buf),(i32)0);}intmain(){stringexpr;cin>>expr;cout<<eval_midexpr(expr)<<'\n';}
python一行结束战斗
这样你就可以查看别的大佬怎么用c++战斗了
真的是怕了这种解析字符串的题目了,我选择狗带
偶然看到了大佬的代码,对比一下我的,这就是大佬的力量吧……我太菜了2333
做这题我错了两次,都是因为对括号的处理有问题。此外,我还考虑了一下括号前面可能有隐式的乘号的情况,不过这题好像不存在这个问题。
我的第一个版本是用了 Lambda 作子函数的。
当然也可以用普通的函数,只不过得显式地传递参数。
做这种题,就让我特别想看龙书,学点屠龙之技(滑稽)。
@echo off
set /p a=
set /a b=%a%
echo %b%
pause
真心希望以后可以#include