您的位置:首页 > 编程语言 > Lua

UVA - 327 Evaluating Simple C Expressions

2016-11-14 18:24 405 查看
2016.11.10

UVA - 327 Evaluating Simple C Expressions

题目大意:根据 ++、-- 的性质计算,a = 1,b = 2……z = 26。输出计算结果和计算后各字母的值。

解题思路:暴力模拟。每碰到一个字母,检查该字母前后是否存在前缀,若存在,将改字母对应的值 +1 或 -1,找到字母前的一个符号 + 或 -,进行对应计算,接着检查该字母是否存在后缀,若存在,将改字母对应的值 +1 或 -1。输出即可。注意自增符号前缀和后缀的计算顺序是不同的,有点难处理。
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#define max 20000

int main() {
int i,j,l,pos,sum,a[26],use[26],postion;
char s[max+1],ch[max];
while (fgets(s, max, stdin)) {
for (i = 0; i < 26; i++) {
a[i] = i + 1;
use[i] = 0;
}
l=0;
for (i = 0; s[i] != '\0'; i++)
if ( (s[i] == '+') || (s[i] == '-') || (isalpha(s[i]))){
ch[l] = s[i];
++l;
}
if (isalpha(ch[0])) {
sum = a[ch[0]-'a'];
postion = ch[0]-'a';
use[postion] = 1;
pos = 1;
}                //第一个数字特殊处理
if ((ch[0] == '+') && (ch[1] == '+'))  {
++a[ch[2]-'a'];
sum = a[ch[2]-'a'];
postion = ch[2]-'a';
use[postion] = 1;
pos = 3;
}   //同上
if ((ch[0] == '-') && (ch[1] == '-')) {
--a[ch[2]-'a'];
sum = a[ch[2]-'a'];
postion = ch[2]-'a';
use[postion] = 1;
pos = 3;
}   //同上
while (pos < l)  {
j = pos;
while ((j < l)&&(!isalpha(ch[j])))
++j;
if (j < l)
use[ch[j]-'a'] = 1;
if (j-pos == 1) {
if (ch[pos] == '+')
sum += a[ch[j]-'a'];
else
sum -= a[ch[j]-'a'];
postion = ch[j]-'a';
} //+,-
if (j-pos==3) {
if ((ch[pos] == '+') && (ch[pos+1] == '+') && (ch[pos+2] == '-')) {	//++-
++a[postion];
postion = ch[j]-'a';
sum = sum-a[postion];
}
if ((ch[pos] == '-') && (ch[pos+1] == '-') && (ch[pos+2] == '+')) { //--+
--a[postion];
postion = ch[j]-'a';
sum = sum+a[postion];
}
if ((ch[pos] == '-') && (ch[pos+5] == '+') && (ch[pos+2] == '+')) { //-++
postion = ch[j]-'a';
++a[postion];
sum = sum-a[postion];
}
if ((ch[pos] == '+') && (ch[pos+1] == '-') && (ch[pos+2] == '-')) { //+--
postion = ch[j]-'a';
--a[postion];
sum = sum+a[postion];
}
}
if (j-pos == 5) {
if (ch[pos] == '+')
++a[postion];
else
--a[postion];  //虽然有6种但是可以化简,
postion = ch[j]-'a';
if (ch[pos+4] == '+')
++a[postion];
else
--a[postion];
if (ch[pos+2] == '+')
sum += a[postion];
else
sum -= a[postion];
}
pos=j+1;
}
if ((ch[l-1] == '+') && (ch[l-2] == '+'))
++a[ch[l-3]-'a'];  //最后一个数字特殊处理
if ((ch[l-1] == '-') && (ch[l-2] == '-'))
--a[ch[l-3]-'a'];  //同上
printf("Expression: %s", s);
printf("    value = %d\n", sum);
for(i = 0; i < 26; i++)
if (use[i])
printf("    %c = %d\n",i+'a',a[i]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: