首页 > 其他分享 >ysyx:对数学表达式的理解

ysyx:对数学表达式的理解

时间:2024-06-03 17:44:13浏览次数:26  
标签:外层 false success int ysyx 括号 数学 func 表达式

数学表达式的递归分解顺序和日常的顺序是完全相反的。一方面,原本的高级运算符要后进行拆分,另一方面,原本的从左到右的运算顺序使得拆分运算符时要从最右侧进行拆分。

要解析一个带有括号的长表达式并没有想象中那么容易

我对括号处理的理解有问题,识别括号时,不是两侧有括号+括号匹配就代表正确

按照讲义提供的逻辑,最外层要有一层能包住完整式子的才是有效的外层括号.

比如这样的一个表达式:((839*(928/((((972)))))-505)-((((666)))-(746*796/723*408-((713))))+365)

第一步肯定是去掉外层括号,然后按照+把前面和365切开。但是,下一步就有问题了:

(839*(928/((((972)))))-505) - ((((666)))-(746*796/723*408-((713)))) 这一部分,看起来,两侧有括号,而且括号左右匹配,那应该继续返回true,去掉最外层再继续?实际上不行,因为最外层的括号并不是包裹整个式子的。去掉多余括号,变成(839*(928/972)-505) - (666-(746*796/723*408-713))。可以看到这个式子其实已经没有最外层括号了,所以应该返回的是false,按照中间的减号拆分。

 

第二个遇到的问题是:代码里全程都使用的是uint32,但这样存在一个问题,就是在计算除法时,假如被除数和除数里有一个是负数(按人的理解),在uint里会被强制转换为正数,导致计算出问题,所以如果想全程保持uint,那么除法这里就需要把两个数先强转int型再计算。

举例:(((261))-826*(739)*(480-((789+863)))/(542)/((991)))   在计算到-715405208 /542  这一步时就出现了问题。正确结果是-1319935,但是计算成了6604358。原本的被除数被理解成了一个超大的uint,导致计算结果是一个正数(int环境)。这显然有问题。为了保险起见,我又测试了一下乘法,似乎不存在这个问题。在DIV的case里强转int后,问题解决了。

那么问题来了,一定要全程使用uint32吗?此外,负数可以用类似的方法处理吗?我感觉uint和int在机器中的处理这一块可能还需要再多看看。   除此之外,我还发现了之前写代码的一个错误思路:  对于一个有bool* 参数的函数,比如 func(bool *success),在外层函数调用func时,正确做法是bool success=false; 调用func时传入&success。 但我却一直在外层声明bool *success=false; 然后调用func(success); 这个点纠结了我一段时间。在外层直接定义*success=false,false会被理解为0.success又是一个指针,这就会导致我实际上声明了一个指向0x00000000的指针,这明显是错的。

标签:外层,false,success,int,ysyx,括号,数学,func,表达式
From: https://www.cnblogs.com/namezhyp/p/18222465

相关文章

  • 新时代的程序员4大本领:lambda表达式,链式编程,函数式接口,Stream流式计算
    传统程序员4大本领:泛型,枚举,反射,注解新时代的程序员4大本领:lambda表达式,链式编程,函数式接口,Stream流式计算lambda表达式//1.不需要参数,返回值为5()->5//2.接收一个参数(数字类型),返回其2倍的值x->2*x//3.接受2个参数(数字),并返回他们的差值(x,y)->x......
  • vscode 报错:应输入表达式
    如图,报错:应输入表达式,但是我的==看起来是正确的。后面发现原来是我的定义有问题,这里定义处多了分号“;”,然后vscode检测不到该定义,故会报错。......
  • Java Lambda表达式
    Lambda表达式Lambda表达式,也可以称为闭包,是Java8发布的最重要新特性Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中)使用Lambda表达式可以使代码变的更加简洁紧凑语法:(parameter)->expression(parameter)->{statement;}parameter:参数列表,......
  • Shell阶段10 awk工作原理, 内部变量, 正则/比较/条件/逻辑表达式, 判断语句, 循环语
    AWK什么是awkawk是一个编程语言主要作用:对文本和数据的处理awk处理数据的流程1.扫描文件内容,从上到下进行扫描,按照行进行处理2.寻找匹配到的内容,进行读取到特定的模式中,进行行处理3.行满足指定模式动作,则输出到屏幕上面,不满足丢弃4.接着读取下一行继续处理,接着循环,直......
  • 每日刷题——相遇、宝石(模拟+数学)、相助(模拟+数组)、相依(dp的优化)
    相遇原题链接登录—专业IT笔试面试备考平台_牛客网题目描述运行代码#include<iostream>usingnamespacestd;intmain(){inta,b;cin>>a>>b;if(a==b){cout<<"p";}elseif(a-b==1||(a==1&&b==3)){cout<<&qu......
  • 正则表达式
    文章目录正则表达式一、正则表达式概述1.1定义1.2作用二、正则表达式工具和使用方法2.3★★★使用正则表达式的分析方法三、简单的正则表达式(限定符,表示限定要匹配字符出现的次数)3.1匹配单个字符3.2?匹配可选字符3.3*+其他限量操作符3.4大括号语法——限定匹......
  • CSP历年复赛题-P1981 [NOIP2013 普及组] 表达式求值
    原题链接:https://www.luogu.com.cn/problem/P1981题意解读:中缀表达式求值,只有+,*,没有括号,保留后4位。解题思路:中缀表达式求值的典型应用,采用两个栈:符号栈、数字栈,对于没有括号的情况,只需要如下步骤:1、遍历表达式每一个字符2、如果遇到数字,则持续提取数字,保存整数到数字栈3、......
  • 基础数学内容重构(后缀0个数)
        今天也是参加了一下宁波大学的校赛,其中有一道题是求后缀0的个数,题意是让我们求一下式子的后缀0个数:                                                                    看上去比较......
  • Java中的Lambda表达式与函数式接口:简化代码与提升效率
            Lambda表达式自Java8引入以来,已成为Java编程中提高代码简洁性与效率的一种重要特性。Lambda表达式允许你以匿名函数的方式来编写方法,使代码更简洁,增强了集合库的功能,尤其是在处理集合操作时。本文将探讨Lambda表达式的基本概念、函数式接口的用途,以及如何在实......
  • Day 11 | 20. 有效的括号 、1047. 删除字符串中的所有相邻重复项 、150. 逆波兰表达式
    20.有效的括号讲完了栈实现队列,队列实现栈,接下来就是栈的经典应用了。大家先自己思考一下有哪些不匹配的场景,在看视频我讲的都有哪些场景,落实到代码其实就容易很多了。题目链接/文章讲解/视频讲解:https://programmercarl.com/0020.有效的括号.html思考classSolution:......