UVA - 327 Evaluating Simple C Expressions

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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值