夏季的春秋 发表于 2023-6-13 15:38:28

24点的题目,答案错了百分之50,但实在不知道错哪了,下面是代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <iostream>

using namespace std;

typedef struct bitnode
{
    char data;
    struct bitnode *lc,*rc;
}bitnode, *bitree;

void create(bitree &t)
{
    char c;
    cin>>c;
    if(c=='#')
    {
      t=NULL;
    }
    else
    {
      t=(bitnode *)malloc(sizeof(bitnode));
      strcpy(t->data,c);
      create(t->lc);
      create(t->rc);
    }
}

void inordertraverse(bitree t)
{
    if(t)
    {
      inordertraverse(t->lc);
      printf("%s ",t->data);
      inordertraverse(t->rc);
    }
}

void print(bitree &t)
{
    if(t)
    {
      if((t->data=='+')||(t->data=='-')||(t->data=='*')||(t->data=='/'))
      {
            printf("%s","(");
            print(t->lc);
            printf("%s",t->data);
            print(t->rc);
            printf("%s",")");
      }
      else
      {
            printf("%s",t->data);
      }
    }
}

int cal(bitree &t)
{
    double result=0;
    int i=0;
    int len=0;
    if(t)
    {
      if(t->data=='+')
      {
            return cal(t->lc)+cal(t->rc);
      }
      else if(t->data=='-')
      {
            return cal(t->lc)-cal(t->rc);
      }
      else if(t->data=='*')
      {
            return cal(t->lc)*cal(t->rc);
      }
      else if(t->data=='/')
      {
            if(cal(t->rc)!=0)
            {
                return cal(t->lc)/cal(t->rc);
            }
      }
      else
      {
                        len=strlen(t->data);
                        for(i=0;i<=len-1;i++){
                                if(t->data>='0'&&t->data<='9')
                {
                                        result=result*10.0+t->data-'0'+0.0;
                                }
                        }
                        return result;
      }
    }
}

int main(void)
{
    char c;
    bitree t;
    while(cin>>c)
    {
      t=(bitnode *)malloc(sizeof(bitnode));
      strcpy(t->data,c);
      create(t->lc);
      create(t->rc);
      if(fabs(cal(t)-24)<0.00001)
      {
            print(t);
            printf("%s","=");
            cout<<cal(t);
      }
      else
      {
            printf("%s","NO");
      }
      printf("\n");
    }

    return 0;
}

sfqxx 发表于 2023-6-13 15:38:29

这道题目可以使用递归的思路,递归地生成二叉树,并计算出表达式的值。对生成的二叉树进行中序遍历,将符合题目要求的输出出来,否则输出 NO。

现在来看代码中存在的问题:

1. 在程序执行完打印相应信息后,没有释放生成树节点所占用的动态内存;

2. 代码中如果遇到除数为零且无法进行运算的情况,则没有进行任何处理,导致程序的计算结果不稳定。

下面是修改过后的代码,仅供参考:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <iostream>

using namespace std;

typedef struct bitnode
{
    char data;
    struct bitnode *lc, *rc;
} bitnode, *bitree;

void create(bitree& t)
{
    char c;
    cin >> c;
    if (c == '#')
    {
      t = NULL;
    }
    else
    {
      t = (bitnode*)malloc(sizeof(bitnode));
      strcpy(t->data, c);
      create(t->lc);
      create(t->rc);
    }
}

void inordertraverse(bitree t)
{
    if (t)
    {
      inordertraverse(t->lc);
      printf("%s ", t->data);
      inordertraverse(t->rc);
    }
}

void print(bitree& t)
{
    if (t)
    {
      if ((t->data == '+') || (t->data == '-') || (t->data == '*') || (t->data == '/'))
      {
            printf("%s", "(");
            print(t->lc);
            printf("%s", t->data);
            print(t->rc);
            printf("%s", ")");
      }
      else
      {
            printf("%s", t->data);
      }
    }
}

double cal(bitree& t)
{
    double result = 0;
    int i = 0;
    int len = 0;
    if (t)
    {
      if (t->data == '+')
      {
            return cal(t->lc) + cal(t->rc);
      }
      else if (t->data == '-')
      {
            return cal(t->lc) - cal(t->rc);
      }
      else if (t->data == '*')
      {
            return cal(t->lc) * cal(t->rc);
      }
      else if (t->data == '/')
      {
            double rc = cal(t->rc);
            if (rc != 0)
            {
                return cal(t->lc) / cal(t->rc);
            }
            else
            {
                return 0;
            }
      }
      else
      {
            len = strlen(t->data);
            for (i = 0; i <= len - 1; i++) {
                if (t->data >= '0' && t->data <= '9')
                {
                  result = result * 10.0 + t->data - '0' + 0.0;
                }
            }
            return result;
      }
    }
    else
    {
      return 0;
    }
}

void destory(bitree& t)
{
    if (t)
    {
      destory(t->lc);
      destory(t->rc);
      free(t);
    }
}

int main(void)
{
    char c;
    bitree t;
    while (cin >> c)
    {
      t = (bitnode*)malloc(sizeof(bitnode));
      strcpy(t->data, c);
      create(t->lc);
      create(t->rc);
      if (fabs(cal(t) - 24) < 0.00001)
      {
            print(t);
            printf("%s", "=");
            cout << cal(t);
      }
      else
      {
            printf("%s", "NO");
      }
      destory(t);//释放创建计算树时所有节点占用的内存
      printf("\n");
    }

    return 0;
}

希望对您有所帮助。

zhangjinxuan 发表于 2023-6-14 18:47:40

sfqxx 发表于 2023-6-14 16:39
这道题目可以使用递归的思路,递归地生成二叉树,并计算出表达式的值。对生成的二叉树进行中序遍历,将符合 ...

自愧弗如{:10_266:}

(bushi抵制gpt么)

sfqxx 发表于 2023-6-14 18:49:19

zhangjinxuan 发表于 2023-6-14 18:47
自愧弗如

(bushi抵制gpt么)

{:5_91:}

sfqxx 发表于 2023-6-14 18:50:07

zhangjinxuan 发表于 2023-6-14 18:47
自愧弗如

(bushi抵制gpt么)

你那个设置楼层奖励有问题,应该是2#

还有,能不能正常一点?{:5_104:}7:05吧。

zhangjinxuan 发表于 2023-6-14 18:53:30

sfqxx 发表于 2023-6-14 18:50
你那个设置楼层奖励有问题,应该是2#

还有,能不能正常一点?7:05吧。

不能{:10_256:}

zhangjinxuan 发表于 2023-6-14 19:00:02

sfqxx 发表于 2023-6-14 18:50
你那个设置楼层奖励有问题,应该是2#

还有,能不能正常一点?7:05吧。

7:05谁都能起得来{:5_109:}

这样,你在深夜的时候这么说:

你:啊,我作业没做!
家长:什么?现在去补!
你:啊,今天太晚了,明天 5 点起补作业吧{:10_256:}

sfqxx 发表于 2023-6-14 19:49:56

zhangjinxuan 发表于 2023-6-14 19:00
7:05谁都能起得来

这样,你在深夜的时候这么说:

buxing

Ewan-Ahiouy 发表于 2023-6-14 20:27:22

zhangjinxuan 发表于 2023-6-14 19:00
7:05谁都能起得来

这样,你在深夜的时候这么说:

太好了{:10_257:}我还一直在想理由呢{:10_256:}
页: [1]
查看完整版本: 24点的题目,答案错了百分之50,但实在不知道错哪了,下面是代码