UVA 11291 - Smeech(概率+词法分析)

UVA 11291 - Smeech

题目链接

题意:给定一个表达式形如e=(p,e1,e2) 该表达式的值为 p(e1+e2)+(1p)(e1e2),求出值

思路:题目是很水,但是处理起来还挺麻烦的,模拟写编译器LEX分析器原理去写了。

代码:

#include <cstdio>
#include <cstring>

const int N = 100005;
char str[N];
int now, len, token;
double value;

void gettoken() {
	while (str[now] == ' ') {now++;}
	if (str[now] == '(') {
		token = 0; now++;
	}
	else if (str[now] == ')') {
		token = 1; now++;
	}
	else if ((str[now] >= '0' && str[now] <= '9') || str[now] == '.' || str[now] == '-') {
		int flag = 1;
  		if (str[now] == '-') {
    		flag = -1;
    		now++;
  		}
  		value = 0;
		token = 2;
		while (now < len && str[now] >= '0' && str[now] <= '9') {
			value = value * 10 + str[now] - '0';
			now++;
		}
		if (str[now] == '.') {
			now++;
			double mu = 10;
			while (now < len && str[now] >= '0' && str[now] <= '9') {
				value += (str[now] - '0') / mu;
				mu *= 10;
    			now++;
   			}
  		}
  		value *= flag;
 	}
}

double expr() {
	gettoken();
	if (token == 0) {
		gettoken();
		double p = value;
		double x = expr();
		double y = expr();
		gettoken();
		return p * (x + y) + (1 - p) * (x - y);
 	}
 	else return value;
}

void init() {
	now = 0;
	len = strlen(str);;
}

int main() {
	while (gets(str) && strcmp(str, "()") != 0) {
		init();
		printf("%.2lf\n", expr());
 	}	
	return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值