比赛场次 | 43 |
---|---|
比赛名称 | 20090923练习赛 |
比赛状态 | 已结束比赛成绩 |
开始时间 | 2009-09-23 19:00:00 |
结束时间 | 2009-09-23 22:00:00 |
开放分组 | 全部用户 |
注释介绍 |
题目名称 | 逻辑表达式 |
---|---|
输入输出 | expressa.in/out |
时间限制 | 1000 ms (1 s) |
内存限制 | 128 MiB |
测试点数 | 5 简单对比 |
用户 | 结果 | 时间 | 内存 | 得分 |
---|---|---|---|---|
ybh | WAWWW | 0.000 s | 0.00 MiB | 20 |
Achilles | WAWWW | 0.000 s | 0.00 MiB | 20 |
maxiem | WAWWW | 0.000 s | 0.00 MiB | 20 |
reamb | EEEEE | 0.000 s | 0.00 MiB | 0 |
【问题描述】
由英文字母和符号~、 *、+、()组成逻辑表达式,英文字母表示变量,变量有两种可能的取值,False或True;~、*、+、括号()可改变表达式的运算次序,且可以嵌套。
逻辑 “非”运算的公式如下表:
A |
~ A |
TRUE |
FALSE |
FALSE |
TRUE |
逻辑 “与”和逻辑“或”的运算公式如下表:
A |
B |
A*B |
A+B |
FALSE |
FALSE |
FLASE |
FLASE |
FALSE |
TRUE |
FLASE |
TRUE |
TRUE |
FALSE |
FALSE |
TRUE |
TRUE |
TRUE |
TRUE |
TRUE |
两个逻辑表达式等价,当且仅当两个公式中相同名字的变量取任何一种值时两个公式的值都相同。如:
A*(B+C) 与 A*B+A*C 等价
A*(~A+B) 与 A*B 等价
(~A+A)*B+C 与 B+C 等价
A*B+A*~B 与 A 等价
而:
A+B 与 A*B 不等价
A*B+~C 与 A*E+~F 不等价
现要求你编程解决下列问题:
任务 1 :读取一个逻辑表达式,判断这个表达式的合法性;
【输入格式1】
输入文件只有一行,一个字符串s,s的长度不超过255。
【输出格式1】
输出文件只有一个单词,yes或no。 表达式合法时输出yes,不合法时输出no。
【输入输出样例1】
输入:
expressa.in
(A+B)*(A-B)
输出:
expressa.out
no
(注:逻辑运算中没有"-"运算)
任务2:
将读入的表达式化简,化简的表达式为
a1*a2*…*aN+b1**b2*…*bM+…+x1*x2*…*xL
其中 ai、bj、…xk(i=1,2,…n; j=1,2,…m; k=1,2,…L)表示一个变量或一个变量的逻辑非;
【输入输出样例2】
输入:
expressb.in
(A+B)*C
输出:
expressb.out
A*C+B*C