码迷,mamicode.com
首页 > 其他好文 > 详细

UESTC_秋实大哥搞算数 2015 UESTC Training for Data Structures<Problem N>

时间:2015-05-01 06:59:06      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:

N - 秋实大哥搞算数

Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)
 

秋实大哥大学物理挂科了,于是在下学期的前两周的某一天要悲剧的补考。为了不给学校的挖掘机大楼做贡献,秋实大哥决定在假期里努力复习。当然,良好的计算能力也是非常必要的,毕竟是涉及计算自己做多少分的题能够通过考试的问题。现在他给自己出了一大堆长长的只有涉及整形四则运算式子,然后埋头计算结果。为了检验自己的计算能力,他请你来帮忙。

Input

第一行一个整数T,表示式子的总数。

接下来每一行有一个长度不超过10^6的表达式,只包含正整数和四则运算符号(‘+‘, ‘-‘, ‘*‘, ‘/‘)。

保证输入合法。

Output

对于每一个表达式,输出相应的结果,占一行。

保证运算及结果在long long范围以内。

Sample input and output

Sample InputSample Output
2
12+5/4-1
4*5/3
12
6

 

解题报告

本题..显然也没有任何的特别技巧,使用栈来处理.

不过还是有几点可以改进,因为没有括号,且数据合法,因此我们可以只用一个栈来实现,并且一遍扫描处理掉所有的* , / , -号,之后留在栈中的元素运算都是+,注意使用long long,这样,就解决了本题.

 

#include <iostream>
#include <cstring>
using namespace std;
typedef long long ll;
const int maxn = 1e6 + 50;

ll s[maxn];
char temp[maxn];

int main(int argc,char *argv[])
{
  int Case,top;
  scanf("%d%*c",&Case);
  while(Case--)
   {
         top = 0;
         char ch;
         ll read = 0;
         int ope = -1;
         ll sign = 1;
         scanf("%s",temp);
         int len = strlen(temp);
         int pos = 0;
         while(pos < len) 
          {
                ch = temp[pos++];
                if (ch == # || ch  ==  )
                 break;
                //printf("%c\n",ch);
                if (ch <= 9 && ch >= 0)
                 {
                       read *= 10;
              read += (ch-0); 
           }
          else
           {
                 s[top++] = read*sign;
                 sign = 1;
                // cout << read << endl;
                 read = 0;
                 if (ope == 2)
                  {
                        s[top-2] = s[top-1]*s[top-2];
                        top--;
               }
              else if(ope == 3)
               {
                     s[top-2] = s[top-2] / s[top-1];
                     top--;
               }
              ope = -1;
              if(ch == -)
                      sign = -1;
              else if(ch == *)
                   ope = 2;
              else if(ch == /)
                ope = 3;
           }
       }
     s[top++] = sign*read;
      if (ope == 2)
        {
            s[top-2] = s[top-1]*s[top-2];
               top--;
        }
      else if(ope == 3)
        {
            s[top-2] = s[top-2] / s[top-1];
            top--;
        }
     ll ans = 0;
     for(int i = 0 ; i < top ; ++ i)
      ans += s[i];
     printf("%lld\n",ans);
   }
  return 0;
}

 

UESTC_秋实大哥搞算数 2015 UESTC Training for Data Structures<Problem N>

标签:

原文地址:http://www.cnblogs.com/Xiper/p/4470231.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!