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:字符串事兒可真多……