您的位置:首页 > 其它

二叉树 24点游戏(Ⅰ) (浮点型精度问题!!!)

2017-12-15 14:45 302 查看
题目描述

24点游戏的玩法是这样的:任取一幅牌中的 4张牌(不含大小王),每张牌上有数字(其中A 代表1,J 代表11,Q 代表 12,K代表13),你可以利用数学中的加、减、乘、除以及括号想办法得到24,每张牌只能用一次。例如有四张6,那么6+6+6+6=24,也可以6*6-6-6=24。但是有些牌是无法得到24的,比如两张 A 和两张2。 

读入表达式树的先序遍历字符串, 这里的表达式树是来自24点游戏的真实场景,也就是对应四个数字(值在1到13之间)组成的表达式,问该表达式树能不能得到24? 

输入

输入由多组测试数据组成。

每组数据包含一行字符串,即24点游戏的表达式树的先序遍历序列。

输出

对于每组数据,输出一行。如果不能得到24,输出“NO”。如果能得到24,按样例输出。

样例输入

+ + + 6 # # 6 # # 6 # # 6 # #

- - * 6 # # 6 # # 6 # # 6 # #
* * 1 # # 2 # # * 1 # # 2 # #

样例输出

(((6+6)+6)+6)=24

(((6*6)-6)-6)=24
NO思路:看到这个题目,发现就是表达式值的类似题,然后交了3发,运行错误,浮点型错误,忽略了除以0的情况,刚开始一直以为是变量初始化的问题,后来同学讨论告诉我说,这个题目的整形计算方式不是计算机而是数学类型的,坑!!!,老师很6,这次学到了浮点型除以0的情况和精度问题

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define OK 1
#define ERROR 0
typedef struct
{
double num;
char ch;
} ElemType;
char word[300];
typedef struct BiTNode
{
ElemType data;
struct BiTNode *lchild,*rchild;
} BiTNode,*BiTree;

void InitBiTree(BiTree &T)
{
char s[20];
cin>>s;
if (s[0]=='#') T=NULL;
else
{
T=new BiTNode;
if (s[0]=='+'||s[0]=='-'||s[0]=='*'||s[0]=='/')
T->data.ch=s[0];
else
{
double n=0.0;
for (int i=0; i<strlen(s); i++)
n=n*10.0+1.0*(s[i]-'0');
T->data.num=n;
}

InitBiTree(T->lchild);
InitBiTree(T->rchild);
}
}

double Cal(BiTree T)
{
double re=0;
if (T->lchild==NULL&&T->rchild==NULL){
// printf("%d",T->data.num);
re=T->data.num;
}
else
{

// printf("(");
double num1=Cal(T->lchild);
//printf("%c",T->data.ch);
double num2=Cal(T->rchild);
// printf(")");
switch (T->data.ch){
case '+':re=num1+num2; break;
case '-':re=num1-num2; break;
case '*':re=num1*num2; break;
case '/':re=num1/num2; break;

}
}
return re;
}
double Travel(BiTree T)
{
double re=0.0;
if (T->lchild==NULL&&T->rchild==NULL){
int n=T->data.num;
printf("%d",n);
re=T->data.num;
}
else
{

printf("(");
double num1=Travel(T->lchild);
printf("%c",T->data.ch);
double num2=Travel(T->rchild);
printf(")");
switch (T->data.ch){
case '+':re=num1+num2; break;
case '-':re=num1-num2; break;
case '*':re=num1*num2; break;
case '/':re=num1/num2; break;
}
}
return re;
}

int main()
{
BiTree T;
char c[20];
while (cin>>c)
{
double re=0.0;
if (c[0]=='#')
T=NULL;
else
{
T=new BiTNode;
if (c[0]=='+'||c[0]=='-'||c[0]=='*'||c[0]=='/')
T->data.ch=c[0];
else
{
double n=0.0;
for (int i=0;i<strlen(c);i++)
n=n*10.0+1.0*(c[i]-'0');
T->data.num=n;
}
InitBiTree(T->lchild);
InitBiTree(T->rchild);
re=Cal(T);
}
//printf("%lf",re);
if(23.999999<=re&&re<=24.000001)
{
double a=Travel(T);
printf("=24\n");
}
else
printf("NO\n");

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: