二叉树 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;
}
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;
}
相关文章推荐
- 二叉树 24点游戏(Ⅰ) (浮点型精度问题!!!)
- 二叉树 24点游戏(Ⅰ) (浮点型精度问题!!!)
- 二叉树 24点游戏(Ⅰ) (浮点型精度问题!!!)
- 二叉树 24点游戏(Ⅰ) (浮点型精度问题!!!)
- 二叉树 24点游戏(Ⅰ) (浮点型精度问题!!!)
- 二叉树 24点游戏(Ⅰ) (浮点型精度问题!!!)
- 威佐夫游戏 V2(精度问题)
- 南阳 477(浮点型的精度问题)
- 浮点型加减乘除(解决浮点型运算精度丢失问题)
- Java数值避免浮点型计算丢失精度问题
- 关于商业运算中浮点型运算丢失精度问题
- 24点游戏问题
- [ACdream]哗啦啦族的24点游戏[dfs][暴力][精度]
- Java中用浮点型数据Float和Double进行精确计算时的精度问题
- java 将小数拆分为两部分+浮点型精度丢失问题
- Java使用BigDecimal解决浮点型运算丢失精度的问题
- 51nod 1185 威佐夫游戏 V2 (用乘法模拟解决大数精度问题)
- js处理浮点型的bug问题--js精度丢失
- php浮点型以及精度问题
- Java中的浮点型进行四则运算精度丢失的问题