XDOJ_题目:切分表达式——MZH

题目:切分表达式

问题描述 四则运算表达式由运算数(必定包含数字,可能包含正或负符号、小数点)、运算符(包 括+、-、*、/)以及小括号((和))组成,每个运算数、运算符和括号都是一个 token(标记)。 现在,对于给定的一个四则运算表达式,请把式子中的每个 token 切分出来。题目保证给定 的表达式是正确的,不需要做有效性检查。

输入格式 在一行中给出长度不超过 40 个字符的表达式,其中没有空格,仅由上文中 token 的字 符组成。

输出格式 依次输出表达式中的 tokens,每个 token 占一行。
 

样例输入 32*((2-2)+5)/(-15)

样例输出

32

*

(

(

2

-

2

)

+

5

)

/

(

-15

)

代码实现:

对于数字的处理有两种方法:方法二正确,请手动下滑哈

第一就是转换为浮点型(因为有小数点)但是这样相对繁琐且我们很难判断数字前面的‘+’和‘-’究竟表示的是正负还是加减...

在我发现这确实太过麻烦之后我就果断放弃了这种方法,因为得分很低且确实不想再改。。。

代码(40分)(没有处理小数点和加号还因为改了几次有点乱。。。)

加号的处理相对简单,和题目中处理减法的部分合并就可以啦

小数点的处理就是找到它的位置,其之后的部分分别除以10的负位数次方即可,我估计硬要打的话在我现在的基础上会冲向百行大关...

#include <stdio.h>
#include <string.h>

int main() {
	char s[1001];
	gets(s);
	int pos = 0, k = 0, num;
	for (register int i = 0; i <= strlen(s); i++) {
		if (s[i] >= '0' && s[i] <= '9' && pos == 0) {
			if (k == 1) {
				printf("-");
				k = 0;
			}
			pos = 1;
			num = s[i] - '0';
			continue;
		}
		if (s[i] >= '0' && s[i] <= '9' && pos == 1) {
			pos = 1;
			num *= 10;
			num += s[i] - '0';
		}
		if (s[i] < '0' && pos == 1 && s[i] != '-' || s[i] > '9' && pos == 1 && s[i] != '-') {
			if (k == 1) {
				printf("-");
				k = 0;
				printf("\n");
			}
			printf("%d\n", num);
			printf("%c\n", s[i]);
			pos = 0;
			continue;
		}
		if (s[i] < '0' && pos == 0 && s[i] != '-' || s[i] > '9' && pos == 0 && s[i] != '-') {
			if (k == 1) {
				printf("-");
				printf("\n");
			}
			printf("%c\n", s[i]);
		}
		if (s[i] == '-') {
			k = 1;
			if (i >= 2 && s[i - 1] == ')' || i >= 2 && s[i - 1] == ']' && i >= 2 && s[i - 1] == '}') {
				printf("-\n");
				k = 0;
				continue;
			}
			if (pos == 1) {
				printf("%d\n-\n", num);
				num = 0;
				k = 0;
			}
		}
	}
	return 0;
}

所以我果断的换了方法

法二:直接输出字符串

#include <stdio.h>
#include <string.h>

int main() {
	char s[10001];
	gets(s);
	int num = 0, word = 0, pos = 0;//num代表上一位是数字,word代表上一位是非数字字符,pos用于位置移动
	while (pos < strlen(s)) {
		if (s[pos] > '9' && s[pos] != '-' && s[pos] != '+' || s[pos] < '0' && s[pos] != '-' && s[pos] != '+') {
           //非数字,非可能会产生特殊情况的加减
			printf("%c\n", s[pos]);//直接输出
			num = 0;//对于下一位该位不是数字
			word = 1;//是字符
		}
		if (s[pos] <= '9' && s[pos] >= '0') {
			word = 0;
			num = 1;//是数字
			while (s[pos] <= '9' && s[pos] >= '0' || s[pos] == '.') {
				printf("%c", s[pos]);//向后遍历如果是一个数字直接输出
				pos++;
			}
			printf("\n");
			continue;//不用再后移循环结束时已经移动
		}
		if (s[pos] == '+' || s[pos] == '-') {
			if (num == 1 || s[pos - 1] == ')' && pos >= 1) {
                //就是两种情况 1.例如:9-8 2.例如(98-89)-89或(98-89)-(98-89)
				printf("%c\n", s[pos]);
			} else {
				printf("%c", s[pos]);//表示正负
			}
		}
		pos++;//直接移动
	}
	return 0;
}

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值