码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-07-17 21:07:29      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:style   http   color   os   width   io   

UVA 11291 - Smeech

题目链接

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

思路:题目是很水,但是处理起来还挺麻烦的,模拟写编译器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;
}


UVA 11291 - Smeech(概率+词法分析),布布扣,bubuko.com

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

标签:style   http   color   os   width   io   

原文地址:http://blog.csdn.net/accelerator_/article/details/37911841

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!