111025 - 表达式求值

题解bytaotao

#include<bits/stdc++.h>
using namespace std;
char s[5000000];int len,ans[5000000],tot=1,key,key2;
int add(int x,int place)//实际上是*的操作,因为不会写乘的英文,,所以
{
    int i=place-1;bool z=true;
    key2=0;
    while(z)//读入下一个数字到key2,此处读入操作同主函数while
    {
        i++;
        if(s[i]<='9'&&s[i]>='0') 
            key2=key2*10+(s[i]-'0');
        if(s[i]>'9'||s[i]<'0')//不是数字就说明读完了,退出
            break;    
    }
    key%=10000;//先取余,不然运算的时候会爆
    key2%=10000;//同上
    key=(key*key2)%10000;//时刻取余,注意结果要存在key中,因为可能有连乘,这样一旦是连乘,key又可以作为上一个数进行操作,key是存的马上或等会要放入ans数组中的值
    return i-1;//i是key2这个数字后面的第一个符号,i-1即为key2这个数字的最后一位,此时-1是为了方便主函数的while
}
int main()
{
    int i=-1;
    gets(s);
    len=strlen(s);
    while(i<len)//注意不要等于,因为gets是从s[0]开始读入的。
    {
        i++;
        if(s[i]<='9'&&s[i]>='0') //key是保存当前数的变量
            key=key*10+(s[i]-'0'); //如果是数字,key就*10+s[i],因为每一个数字都在int范围内,所以不着急取余
        else if(s[i]!='*') //如果不等于乘,注意,这里不能是==‘+’,因为最后一个数字后面是没有符号的,所以直接else if
        {
            ans[tot]=key%10000;//把数字加入ans数组,ans数组用来储存最后要被加的数字
            tot++;//tot记录ans里面数字应该放在哪
            key=0;//重置key
        }
        else if(s[i]=='*')//如果是‘*’
        {
            i++;//i跳到下一个,也就是要乘的数字的开头
            i=add(key,i);//因为可能有连乘,所以只能在上一个else if中存入ans数组
                        //此处要改变i的值,因为在while开头会i++,所以将i放在key2的最后一个数的位置,一旦++,i就会指向下一个符号,然后就可以再次进行*的操作或存入ans数组
        }
    }
    key=0;
    for(i=1;i<=tot;i++)
        key=(ans[i]+key)%10000;//最后将所有数都加起来
    printf("%d",key);
    return 0;
}

题解bytaotao

#include<bits/stdc++.h>
using namespace std;
#define Mod 10000
stack <int> n;
int main()
{
  //freopen("enpr.in","r",stdin);
  //freopen("enpr.out","w",stdout);
  int a,b;
  char c;
  cin>>a;
  a=a%Mod;
  n.push(a);
  while(cin>>c>>b)
  {
    if(c=='*')//乘号的话就把之前的栈顶*b给存进去 
    {
      a=n.top();
      n.pop();
      n.push(a*b%Mod);//%Mod防止爆掉 
    }
    else
      n.push(b);
  }
  short ans=0;//四位数用short就可以 
  while(!n.empty())
  {
    a=(a+n.top())%Mod;
    n.pop();
  }
  cout<<a<<endl;
  return 0;
}