92 表达式求值
作者: 朱星垠 时间限制: 1S章节: 字符串
问题描述 :
以字符串形式输入仅有整数和加减(正负)号构成的表达式,输出该表达式的值。
输入说明 :
标准输入设备中有多组测试数据,每组输入数据由一行组成,输入仅有整数和加减(正负)号构成的表达式(但是表达式可以插入空格)。
输出说明 :
依次输出从标准输入设备中读入的每一组测试数据对应的结果,输出一行,输出该表达式的值。所有数据前后没有多余的空格,两组数据之间也没有多余的空行。
输入范例 :
3+ 4+ 5+6
0+1
输出范例 :
18
1
代码:
/*
T92 表达式求值
*/
#include<stdio.h>
#include<string.h>
#define MAX_SIZE 1000
int main() {
int i = 0;
int num = 0;// 表达式当中的数字
int res = 0;
char op = '#';// 表达式当中的运算符
char exp[MAX_SIZE] = "";
while (scanf("%d", &num) != EOF) {
res = num;
while (1) {
while ((op = getchar()) == ' ');// 忽略空格
if (op == '\n')
break;
scanf("%d", &num);
if (op == '+')
res += num;
else
res -= num;
}
printf("%d\n", res);
}
return 0;
}
本地运行时没问题的,可是oj上超时,查到原因是if (op == ‘\n’) break;这条语句在oj中没有奏效,那么在oj中一行的结束怎么判断呢?
害,试试其他方法:
/*
T92 表达式求值
算法概述:按照读运算符、读数字、读运算符、读数字……这样的顺序处理,
每处理一次按照运算符的正负计算一次
*/
#include<stdio.h>
#include<string.h>
#define MAX_SIZE 1000
int main() {
int i = 0;
int num = 0;// 表达式当中的数字
int res = 0;
char preOp = '+';// 数字前的运算符
int count = 0;// 读取到的除了空格外的字符的数量
char exp[MAX_SIZE] = "";// 表达式
while (gets(exp)) {
count = 0, res = 0, i = 0;
while (i < strlen(exp)) {
while (exp[i] == ' ')// 忽略空格
i++;
count++;
if (count == 1 && (exp[i] >= '0' && exp[i] <= '9')) {// 第一个字符特殊处理
preOp = '+';
num = 0;
while (exp[i] >= '0' && exp[i] <= '9') {// 合成数字
num = num * 10 + (exp[i] - '0');
i++;
}
res = num;
continue;
}
preOp = exp[i++];// 读运算符
while (exp[i] == ' ')// 忽略空格
i++;
num = 0;
while (exp[i] >= '0' && exp[i] <= '9') {// 合成数字
num = num * 10 + (exp[i] - '0');
i++;
}
if (preOp == '+')
res += num;
else
res -= num;
}
printf("%d\n", res);
}
return 0;
}
AC了,不过这里有两个坑:
- 输入字符串判断EOF不能用gets(exp) != EOF,直接用gets(exp)就行
- scanf("%s", exp);这个碰到空格就算读取完成了,如果需要读取一行包括空格的,那么需要改为gets(exp)
ps:字符串事儿可真多……