UVa 327 - Evaluating Simple C Expressions
2016-03-22 14:45
495 查看
題目:給你一些C語言表達式,字母a~z代表初始值為1~26的變量,計算表達式的值以及計算后的個變量的值。
分析:模擬。模擬計算即可,因為式子簡單,沒有複雜的結合,直接判斷字母前後相鄰的相同符號為一組。
說明:╮(╯▽╰)╭。
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
using namespace std;
char expression[121] = "#";
int value[26], appear[26];
int before(char str[], int index)
{
if (index > 0) index --;
while (str[index] == ' ')
index --;
return index;
}
int after(char str[], int index)
{
index ++;
while (str[index] == ' ')
index ++;
return index;
}
int main()
{
while (gets(&expression[1])) {
expression[strlen(expression)+1] = 0;
expression[strlen(expression)] = '#';
for (int i = 0; i < 26; ++ i) {
value[i] = i+1;
appear[i] = 0;
}
int ans = 0, b1, b2, a1, a2, op, test;
for (int i = 1; expression[i] != '#'; ++ i) {
if (expression[i] >= 'a' && expression[i] <= 'z') {
appear[expression[i]-'a'] = 1;
b2 = before(expression, b1 = before(expression, i));
a2 = after (expression, a1 = after (expression, i));
//before
if (expression[b1] == '+' && expression[b2] =='+')
value[expression[i]-'a'] ++;
if (expression[b1] == '-' && expression[b2] == '-')
value[expression[i]-'a'] --;
//value
if ((expression[b1] == '+' && expression[b2] == '+') ||
(expression[b1] == '-' && expression[b2] == '-'))
op = before(expression, b2);
else op = b1;
test = before(expression, op);
//printf("<%d %d %d>\n",b1,b2,op);
if (expression[op] == '#')
ans = value[expression[i]-'a'];
else if (expression[test] == '#') {
if (expression[op] == '-')
ans = -value[expression[i]-'a'];
else ans = value[expression[i]-'a'];
}else {
if (expression[op] == '-')
ans = ans - value[expression[i]-'a'];
else ans = ans + value[expression[i]-'a'];
}
//after
if (expression[a1] == '+' && expression[a2] =='+')
value[expression[i]-'a'] ++;
if (expression[a1] == '-' && expression[a2] == '-')
value[expression[i]-'a'] --;
}
}
expression[strlen(expression)-1] = 0;
printf("Expression: ");
puts(&expression[1]);
printf(" value = %d\n",ans);
for (int i = 0; i < 26; ++ i)
if (appear[i])
printf(" %c = %d\n",i+'a',value[i]);
}
return 0;
}
分析:模擬。模擬計算即可,因為式子簡單,沒有複雜的結合,直接判斷字母前後相鄰的相同符號為一組。
說明:╮(╯▽╰)╭。
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
using namespace std;
char expression[121] = "#";
int value[26], appear[26];
int before(char str[], int index)
{
if (index > 0) index --;
while (str[index] == ' ')
index --;
return index;
}
int after(char str[], int index)
{
index ++;
while (str[index] == ' ')
index ++;
return index;
}
int main()
{
while (gets(&expression[1])) {
expression[strlen(expression)+1] = 0;
expression[strlen(expression)] = '#';
for (int i = 0; i < 26; ++ i) {
value[i] = i+1;
appear[i] = 0;
}
int ans = 0, b1, b2, a1, a2, op, test;
for (int i = 1; expression[i] != '#'; ++ i) {
if (expression[i] >= 'a' && expression[i] <= 'z') {
appear[expression[i]-'a'] = 1;
b2 = before(expression, b1 = before(expression, i));
a2 = after (expression, a1 = after (expression, i));
//before
if (expression[b1] == '+' && expression[b2] =='+')
value[expression[i]-'a'] ++;
if (expression[b1] == '-' && expression[b2] == '-')
value[expression[i]-'a'] --;
//value
if ((expression[b1] == '+' && expression[b2] == '+') ||
(expression[b1] == '-' && expression[b2] == '-'))
op = before(expression, b2);
else op = b1;
test = before(expression, op);
//printf("<%d %d %d>\n",b1,b2,op);
if (expression[op] == '#')
ans = value[expression[i]-'a'];
else if (expression[test] == '#') {
if (expression[op] == '-')
ans = -value[expression[i]-'a'];
else ans = value[expression[i]-'a'];
}else {
if (expression[op] == '-')
ans = ans - value[expression[i]-'a'];
else ans = ans + value[expression[i]-'a'];
}
//after
if (expression[a1] == '+' && expression[a2] =='+')
value[expression[i]-'a'] ++;
if (expression[a1] == '-' && expression[a2] == '-')
value[expression[i]-'a'] --;
}
}
expression[strlen(expression)-1] = 0;
printf("Expression: ");
puts(&expression[1]);
printf(" value = %d\n",ans);
for (int i = 0; i < 26; ++ i)
if (appear[i])
printf(" %c = %d\n",i+'a',value[i]);
}
return 0;
}
相关文章推荐
- 调试lua代码
- lua的Debug库
- Lua中的异常处理pcall、xpcall、debug使用实例
- 150. Evaluate Reverse Polish Notation
- 快速掌握Lua 5.3 —— 扩展你的程序 (2)
- lua 面向对象编程
- wireshark协议解析插件【LUA】示例
- tolua.cast的实用方法
- 快速掌握Lua 5.3 —— 扩展你的程序 (1)
- lua实现全排列和组合排列
- lua2c
- lua bytecode 编译
- lintcode-medium-Evaluate Reverse Polish Notation
- (转)Lua学习笔记1:Windows7下使用VS2015搭建Lua开发环境
- lua 调用.so 和 require 使用
- Wireshark使用drcom_2011.lua插件协助分析drcom协议
- Lua 语言中的模式匹配
- CsToLua
- c# lua 简单交互
- Leetcode 150. Evaluate Reverse Polish Notation