cdoj 秋实大哥搞算数

可紊 提交于 2020-03-30 08:19:53

地址:http://acm.uestc.edu.cn/#/contest/show/95

题目:

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

思路:

,,wa次数最多的题目,,一开始没判\r(第一见要判这个的,涨姿势了),,,wa无数次

然后智商不够,用栈搞不出来,又只能自己想了。。。。。。

         我的做法是对答案有影响的就三个操作符,当前读取的操作符,和前两个,然后对所有情况分类讨论,,,这样就可以在读取的时候做的一边读取一边计算了。。。

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstdio>
 4 #include <cmath>
 5 #include <cstring>
 6 #include <queue>
 7 #include <stack>
 8 #include <map>
 9 #include <vector>
10 #include <cstdlib>
11 #include <string>
12 
13 #define PI acos((double)-1)
14 #define E exp(double(1))
15 using namespace std;
16 
17 int main (void)
18 {
19     int t;
20     cin>>t;
21     getchar();
22     while(t--)
23     {
24         long long num[5],ans=0;
25         char op[5],c;
26         scanf("%lld",&num[1]);
27         if(scanf("%c",&c)==EOF||c=='\n')
28         {
29             printf("%lld\n",num[1]);continue;
30         }
31         op[2]=c;//3为当前操作数
32         scanf("%lld",&num[2]);
33         while(scanf("%c",&op[3])!=EOF && op[3]!='\n')
34         {
35             scanf("%lld",&num[3]);
36             if(op[3]=='*'||op[3]=='/')
37             {
38                 if(op[2]=='+'||op[2]=='-')
39                 {
40                     if(op[3]=='*')num[2]*=num[3];
41                     else num[2]/=num[3];
42 
43                 }
44                 else
45                 {
46                     if(op[2]=='*') num[1]*=num[2];
47                     else num[1]/=num[2];
48                     num[2]=num[3];
49                     op[2]=op[3];
50                 }
51 
52             }
53             else
54             {
55                 if(op[2]=='+'||op[2]=='-')
56                 {
57                     if(op[2]=='+') num[1]+=num[2];
58                     else num[1]-=num[2];
59                     num[2]=num[3];
60                     op[2]=op[3];
61                 }
62                 else
63                 {
64                      if(op[2]=='*') num[1]*=num[2];
65                      else   num[1]/=num[2];
66                      num[2]=num[3];
67                      op[2]=op[3];
68                 }
69             }
70         }
71         if(op[2]=='*')  ans=num[1]*num[2];
72             else if(op[2]=='/') ans=num[1]/num[2];
73             else if(op[2]=='+') ans=num[1]+num[2];
74             else    ans=num[1]-num[2];
75         printf("%lld\n",ans);
76     }
77 
78     return 0;
79 }
View Code

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!