UVA327
模拟
这个问题的任务是求解一组c语言里的表达式,但是你不需要知道c语言是怎么解决这个问题!
每一行一个表达式,每个表达式的组成不会超过110个字符.
待求解的表达式只包含一个int类型变量和一个组有限的操作;
表达式内不包含常量.
在我们简单的表达内将可能出现26个变量,变量名从‘a’到‘z’(小写字母形式).
在每个表达式开始前,这26个变量的值从1到26,(a=1,b=2.......z=26),
每个变量在一个表达式里面只出现一次,可能有许多变量没有被使用.
二元操作符+和-号可能在表达式内出现,计算法则根据通常的理解.
因此这个表达式a+c-d+b的值等于2(计算方式,1+3-4+2=2).
表达式内还可能出现++,--操作符.
++和--是一元操作符(只要一个操作数),++和--出现的任意变量的前面和后面.
当++操作符在变量前面时,将变量的值加1在变量拿来决定整个表达值前(使用前+1).
因此,表达式++ c - b 的值等于2,c的值加到4在计算整个表达期间(c=3,++c=4).
当++操作符出现在表达后面时,在变量拿来决定整个表达的值后加1(使用后再+1).
因此表达式 c ++ - b的值是1,但是c在计算完整个表达式后将会增加,它的值是4.
--操作符的和++操作符一样,同样能出现在变量的前面或者后面,用于将一个变量减1,
--操作放在变量的前面或后面的意义和++操作符一样,
因此表达式 --c + b--的值等于4,
计算完表达式后,c的值等于2,b的值等于1.
下面是其他算法规则用于解释++和--操作,我们只解释++(--的意义一样):
1.标识前面有++操作符的变量,写一个简单的赋值语句用于增加每个变量的值,然后在表达式使用前移除++操作符.
2.同样的方式,标识后面有++操作符的变量,写一个简单的赋值语句用于增加每个变量的值,然后在表达式使用后移除++操作符.
3.现在没有任何++操作符在每个变量前面和后面,写一个语句对剩余的表达式求解,先写入步骤1,然后写入步骤2.
Write the statement that evaluates the remaining expression after those statements written in step 1, and before those written in step 2.
4.执行顺序,执行第一步产生的语句,然后执行第三步产生的语句,最后执行第二步产生的语句
适用说明,求解表达式 ++ a + b ++等于计算 a=a+1(第一步算法),表达式=a+b(来自第三步算法),b=b+1(第二步算法),表达最后的值等于=a+b(4),
输入:
你的程序读取表达式,一个表达式一行,直到文件结束.
输出:
打印每个你读取的完整表达式,在不同的行中打印表达式的值,在表达式求解后每个变量的值,没有使用过的变量不用展示,
下面是期望输出的输出样例格式
每个表达式内的空格在求解时应该被忽略,不清楚的表达式不会出现在输入文件内,
比如表达式a+++b是不清楚的(原因:表达式可以当成a++ +b 或者 a + ++b).
同样,++和--操作符不会同时出现在同一个变量的前面和后面.因此类似表达式++a++的表达式不会出现在输入数据内.
#include<stdio.h>
#include<iostream>
#include <strstream>
#include<memory.h>
using namespace std;
struct Node
{
int index;
char op;
}; void init(int* const a);
bool isLetter(char a); int s1(string str, int used[], int a[])
{
int sum = 0;
int length = str.length();
char op = ' ';
for (int i = 0; i < length; i++)
{
char c = str.at(i);
if (c == ' ')
continue;
if (isLetter(c))
{
used[c - 'a'] = 1;
if (op == '-')
sum -= a[c - 'a'];
else if (op == '+')
sum += a[c - 'a'];
else if (op == ' ')
sum += a[c - 'a'];
op = ' ';
}
else
{
if (c == '-')
{
char aop = str.at(i + 1);
if (aop == c)
{
if (i > 0 && isLetter(str.at(i - 1)))
{
//a++
a[str.at(i - 1) - 'a']--;
}
else
{
//++a
a[str.at(i + 2) - 'a']--;
}
i++;
}
else
op = c;
}
else if (c == '+')
{
char aop = str.at(i + 1);
if (aop == c)
{
if (i > 0 && isLetter(str.at(i - 1)))
{
//a++
a[str.at(i - 1) - 'a']++;
}
else
{
//++a
a[str.at(i + 2) - 'a']++;
}
i++;
}
else
op = c;
}
}
}
return sum;
}
int main()
{
//freopen("d:\\1.txt", "r", stdin);
string str;
while (getline(cin, str))
{
string str2 = "";
int length = str.length();
for (int i = 0; i < length; i++)
{
if (str.at(i) == ' ')
continue;
str2 = str2 + str.at(i);
}
int a[27];
int used[27];
memset(used, 0, sizeof(int) * 27);
init(a);
int sum = 0;
sum = s1(str2, used, a);
cout << "Expression: " << str << endl;
cout << " value = " << sum << endl;
for (int i = 0; i < 26; i++)
{
if (used[i] == 1)
cout << " " << (char) ('a' + i) << " = " << a[i] << endl;
}
}
} void init(int* const a)
{
for (int i = 0; i < 26; i++)
{
a[i] = i + 1;
}
} bool isLetter(char a)
{
return a >= 'a' && a <= 'z';
}
UVA327的更多相关文章
- uva-327
题意:给出一个C语言加减法表达式,求出这个表达式的最终结构,以及各个变量的值,每个变量保证至出现一次,保证输入的字符串合法: 输入:一串包含+.-和小写的26个英文字母: 输出:表达式的结果,以及表达 ...
- 基础数据结构之(Binary Trees)
从头开始刷ACM,真的发现过去的很多漏洞,特别越是基础的数据结构,越应该学习得精,无论是ACM竞赛,研究生考试,还是工程上,对这些基础数据结构的应用都非常多,深刻理解非常必要.不得不说最近感触还是比较 ...
随机推荐
- 你在AutoHotKey面前居然敢比调音量 - imsoft.cnblogs
当你正在电脑游戏中酣战之际.或者正沉浸在动作大片紧张激烈的情节中.或者正在全神贯注的聆听优美动听音乐……,在这些场景中,如果你需要迅速对音量进行调节(例如增大减小音量,或者静音)怎么办?难道返回Win ...
- 【HDU5421】Victor and String(回文树)
[HDU5421]Victor and String(回文树) 题面 Vjudge 大意: 你需要支持以下操作: 动态在前端插入一个字符 动态在后端插入一个字符 回答当前本质不同的回文串个数 回答当前 ...
- Codeforces Round #224 (Div. 2) A. Ksenia and Pan Scales
A. Ksenia and Pan Scales time limit per test 1 second memory limit per test 256 megabytes input stan ...
- hdu1114 dp(完全背包)
题意:已知空钱罐质量和满钱罐质量(也就是知道钱罐里的钱的质量),知道若干种钱币每种的质量以及其价值,钱币都是无限个,问最少钱罐中有多少钱. 这个题在集训的时候学长给我们做过,所以你会做是应该的,由于已 ...
- python 命名空间和作用域
这是python的难点和特点, 有很多的和c/cpp不一样的地方. 它的灵活易用性造成不习惯之处. refer to: http://blog.csdn.net/cc7756789w/article ...
- width百分比
table中的td可以在页面中直接在元素上设置width:但是li不能只能在页面中写style: <!-- <li width="20%" class="p- ...
- 脸部识别JavaScript类库Tracking.js
作者 王文刚 发布于 2014年8月10日 | 对Web开发者而言,开源的JavaScript库Tracking.js正在使计算机视觉和增强现实技术变得简单, 使用它可以展示效果类似Kinect或 ...
- NTLM 了解
NTLM是NT LAN Manager的缩写,这也说明了协议的来源.NTLM 是 Windows NT 早期版本的标准安全协议,Windows 2000 支持 NTLM 是为了保持向后兼容.Windo ...
- js实现表格行的动态加入------Day56
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/marSmile_tbo/article/details/36752655 现代页面通常都是用div+ ...
- Jenkins系列之Jenkins配置常用工具和如何下载插件
上一篇我们介绍了Jenkins的安装,这一篇我们介绍如何配置Jenkins的工具和如何下载插件. 首先我们先来看如何配置工具,这里的工具是指JDK.Ant.Maven.Git等. 1.点击系统管理,如 ...