1913: 小火山的计算能力
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 433 Solved: 103
Submit Status Web Board
Description
别人说小火山的计算能力不行,小火山很生气,于是他想证明自己,现在有一个表达式,他想计算出来。
Input
首先是一个t(1<=20)表示测试组数。然后一个表达式,表达式长度不超过200,只有加法和减法,并且保证第一个字符不会是运算符号,最终结果小于2^63-1。
Output
输出运算结果。
Sample Input
21+12+1-1
Sample Output
22
HINT
Source
思路:
看起来很简单的题目,愣是敲了两个小时,结果还错一次!
优先队列是不是也可以解决昂?就是太麻烦,用的很普通的模拟方法。
另外,注意看就会发现:第一位保证不是符号
优先处理第一个符号位之前的数字,之后的都用相同的方法处理:前面是 + 当做正数;否则为负数。
Code:
#include<cstdio>
#include<cstring>
#include<cmath>
typedef long long LL;
const int MYDD=1103;
int main() {
int t;
scanf("%d",&t);
while(t--) {
char dd[MYDD];
char ctemp[MYDD];
scanf("%s",dd);
int wqs=strlen(dd);
int k;
LL ANS=0;
LL ans=0;
int j=0;
while(dd[j]>='0'&&dd[j]<='9') { //保证第一个字符不会是运算符号
ANS=ANS*10+dd[j]-'0';
j++;
}
char hpu;//符号位
while(j<wqs) {
hpu=dd[j];//得到符号
j++;
k=0;
ans=0;
while(dd[j]>='0'&&dd[j]<='9') {//没有遇到符号位一直循环
ctemp[k]=dd[j];
j++,k++;
}
for(int i=0; i<k; i++) {
ans=ans*10+ctemp[i]-'0';//转化为数字
}
if(hpu=='-') ANS-=ans;
if(hpu=='+') ANS+=ans;
}
printf("%lld\n",ANS);
}
return 0;
}
/*
2
2+1-1+36+12
200+100-100+100+1000000
*/