鱼C论坛

 找回密码
 立即注册
查看: 861|回复: 8

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

[复制链接]
发表于 2023-6-13 15:38:28 | 显示全部楼层 |阅读模式
10鱼币
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <iostream>

using namespace std;

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

void create(bitree &t)
{
    char c[10];
    cin>>c;
    if(c[0]=='#')
    {
        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[0]=='+')||(t->data[0]=='-')||(t->data[0]=='*')||(t->data[0]=='/'))
        {
            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[0]=='+')
        {
            return cal(t->lc)+cal(t->rc);
        }
        else if(t->data[0]=='-')
        {
            return cal(t->lc)-cal(t->rc);
        }
        else if(t->data[0]=='*')
        {
            return cal(t->lc)*cal(t->rc);
        }
        else if(t->data[0]=='/')
        {
            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[i]>='0'&&t->data[i]<='9')
                {
                                        result=result*10.0+t->data[i]-'0'+0.0;
                                }
                        }
                        return result;
        }
    }
}

int main(void)
{
    char c[10];
    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;
}
最佳答案
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[10];
    struct bitnode *lc, *rc;
} bitnode, *bitree;

void create(bitree& t)
{
    char c[10];
    cin >> c;
    if (c[0] == '#')
    {
        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[0] == '+') || (t->data[0] == '-') || (t->data[0] == '*') || (t->data[0] == '/'))
        {
            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[0] == '+')
        {
            return cal(t->lc) + cal(t->rc);
        }
        else if (t->data[0] == '-')
        {
            return cal(t->lc) - cal(t->rc);
        }
        else if (t->data[0] == '*')
        {
            return cal(t->lc) * cal(t->rc);
        }
        else if (t->data[0] == '/')
        {
            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[i] >= '0' && t->data[i] <= '9')
                {
                    result = result * 10.0 + t->data[i] - '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[10];
    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;
}

希望对您有所帮助。

最佳答案

查看完整内容

这道题目可以使用递归的思路,递归地生成二叉树,并计算出表达式的值。对生成的二叉树进行中序遍历,将符合题目要求的输出出来,否则输出 NO。 现在来看代码中存在的问题: 1. 在程序执行完打印相应信息后,没有释放生成树节点所占用的动态内存; 2. 代码中如果遇到除数为零且无法进行运算的情况,则没有进行任何处理,导致程序的计算结果不稳定。 下面是修改过后的代码,仅供参考: 希望对您有所帮助。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[10];
    struct bitnode *lc, *rc;
} bitnode, *bitree;

void create(bitree& t)
{
    char c[10];
    cin >> c;
    if (c[0] == '#')
    {
        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[0] == '+') || (t->data[0] == '-') || (t->data[0] == '*') || (t->data[0] == '/'))
        {
            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[0] == '+')
        {
            return cal(t->lc) + cal(t->rc);
        }
        else if (t->data[0] == '-')
        {
            return cal(t->lc) - cal(t->rc);
        }
        else if (t->data[0] == '*')
        {
            return cal(t->lc) * cal(t->rc);
        }
        else if (t->data[0] == '/')
        {
            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[i] >= '0' && t->data[i] <= '9')
                {
                    result = result * 10.0 + t->data[i] - '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[10];
    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;
}

希望对您有所帮助。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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


自愧弗如

(bushi抵制gpt么)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-14 18:49:19 | 显示全部楼层
zhangjinxuan 发表于 2023-6-14 18:47
自愧弗如

(bushi抵制gpt么)

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-14 18:50:07 | 显示全部楼层
zhangjinxuan 发表于 2023-6-14 18:47
自愧弗如

(bushi抵制gpt么)

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

还有,能不能正常一点?7:05吧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

不能
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-14 19:00:02 | 显示全部楼层
sfqxx 发表于 2023-6-14 18:50
你那个设置楼层奖励有问题,应该是2#

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

7:05谁都能起得来

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

你:啊,我作业没做!
家长:什么?现在去补!
你:啊,今天太晚了,明天 5 点起补作业吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-14 19:49:56 | 显示全部楼层
zhangjinxuan 发表于 2023-6-14 19:00
7:05谁都能起得来

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

buxing
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-14 20:27:22 | 显示全部楼层
zhangjinxuan 发表于 2023-6-14 19:00
7:05谁都能起得来

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

太好了我还一直在想理由呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 09:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表