UVA - 327 Evaluating Simple C Expressions

来源:互联网 发布:php流程引擎 编辑:程序博客网 时间:2024/06/14 13:52

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 20000int 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];elsesum -= 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;}


0 0
原创粉丝点击