东华oj-进阶题第92题-表达式求值

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了,不过这里有两个坑:

  1. 输入字符串判断EOF不能用gets(exp) != EOF,直接用gets(exp)就行
  2. scanf("%s", exp);这个碰到空格就算读取完成了,如果需要读取一行包括空格的,那么需要改为gets(exp)

ps:字符串事儿可真多……

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章