风雨无阻

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;
}