Links: 风雨无阻
Description:
许cosin的宝贝手表被他的仇人gen海偷走了。他决定秘密前往gen海家,去找回他的手表。
许cosin历经千辛万苦,耗时3天,终于找到了gen海家。他通过观察发现gen海不在家,于是他决定偷偷潜入gen海家,然后找回手表。但他在gen海家的门前发现了一个密码锁,他必须解开这个锁才能进入gen海家。可是许cosin实在是太silly了,于是他就向你请教。请快速解决这个问题,gen海还有1秒就会回家了。
锁上有两行,第一行一个数字N。第二行是一串字符串S(|S|≤6*105),字符串由许多子串构成,每个子串的格式均是XA
其中X是一个运算符,A是一个数字。X可能是*,+,-,%,^(^表示次方)。
现在需要把数字N代入字符串S,从左到右进行运算。密码就是运算结果的绝对值。
题目保证运算过程中N在int(-2147483648~2147483647)范围内,^后面的数字只能为2。运算过程从左至右,不满足运算的优先级(详见样例)
输入描述:
两行,第一行一个正整数N
第二行是一个字符串S
输出描述:
一个数,表示运算结果的绝对值
示例1
输入
5
-7*3
输出
6
说明
5-7=-2
-2*3=-6
|-6|=6
Intentional analysis:
When I first saw this problem,I think i can AC it easily through the "eval" in python.But,there is no need to consider the precedence of operators here.So I give it up and choose c/c++.I think the main thought is simulation.Process the string.But a other problem came is that a nubmer maybe many chars.So we must process the string with a special way instead of one by one which is wrong.
Click to see Chinese Intentional analysis
第一眼看到这个题,我直接想到了python中的eval函数,但是发现题目要求的是不考虑运算符的优先级,所以这个就不能用了。我有回归本行使用c/c++来写,就是一个简单的模拟,但是每次出现的数字它不一定只有一位,这就是这道题麻烦的地方,我选择了用字符串数组存起来每个数,因为题目保证每个运算符后面一定会有数字,所以只要按着顺序来就行,还有个麻烦的地方就是字符串跟整型之间的运算,即将字符串类型转换为整形。一开始我直接模拟了一下转换过程,也是过了这道题,后来我想到一个很方便的函数——stoi。基本作用就是直接将string类型转换为整型。关于这个函数我在这篇博文下面有详细的介绍,有兴趣的可以看一下。My fisrt code:
#include<bits/stdc++.h> using namespace std; typedef long long ll; string mid[100005]; ll zh(string x) { ll ans=0,m,j=1; for(int i=x.size()-1;i>=0;i--) { m=(x[i]-'0')*j; j*=10; ans+=m; } return ans; } int main() { ll a,j=0; string s; cin>>a>>s; for(int i=0;i<s.size();i++) { if(s[i]>='0'&&s[i]<='9') { mid[j]+=s[i]; } else j++; } j=1; for(int i=0;i<s.size();i++) { if(s[i]>='0'&&s[i]<='9') { continue; } if(s[i]=='+') a+=zh(mid[j]); if(s[i]=='-') a-=zh(mid[j]); if(s[i]=='%') a%=zh(mid[j]); if(s[i]=='^') a*=a; if(s[i]=='*') a*=zh(mid[j]); j++; } cout<<abs(a)<<endl; }
A easy code and a easy thought.
After sumbit this code,I thought of a function----"stoi".It can convert string type directly to int type.So this is more easily!
Code:
#include<bits/stdc++.h> using namespace std; typedef long long ll; string mid[100005]; int main() { ll a,j=0; string s; cin>>a>>s; for(int i=0;i<s.size();i++) { if(s[i]>='0'&&s[i]<='9') { mid[j]+=s[i]; } else j++; } j=1; for(int i=0;i<s.size();i++) { if(s[i]>='0'&&s[i]<='9') { continue; } if(s[i]=='+') a+=stoi(mid[j]); if(s[i]=='-') a-=stoi(mid[j]); if(s[i]=='%') a%=stoi(mid[j]); if(s[i]=='^') a*=a; if(s[i]=='*') a*=stoi(mid[j]); j++; } cout<<abs(a)<<endl; }