以分数形式解算表达式字符串『PHP实现』

本文介绍了解决全日制steam小游戏『24点』后端表达式结算的问题,通过PHP实现分数形式的计算。首先,解析包含四则运算和括号的字符串表达式,然后进行分数运算,包括加、减、乘、除和约分。提供了Fraction类的设计以及约分流程,最终展示PHP代码实现。
摘要由CSDN通过智能技术生成

问题来源

全日制steam小游戏『24点』实现过程中遇到的问题,现在,通过某种方法,后端能得到一个字符串表达式,含有四则运算和括号。要求结算该表达式得到结果。对于计算结果,若为整数,直接以整数结果表示;若为分数则以分数结果表示,不能转成浮点数。

解决思路

分解问题

其实是一个经典的算法问题以及一个分数运算问题:

  1. 解析字符串表达式,表达式中含有+、-、*、/、( 和 )
  2. 将一般的数值运算转为分数运算,其中,值得注意的是 分数的约分 逻辑

解析字符串表达式

首先,忽略分数计算的问题,解析字符串表达式,这个算是一个经典问题,大学时期应该都有了解,这里提供一个leetcode题目作为参考: leetcode - 227. 基本计算器2 Basic Calculator II 。在这个题目的基础上,增加解析括号的要求,即为本小节需要解决的问题。

表达式中含有四则运算括号,因此存在运算优先级的问题,为了减少递归,对于乘除法没有执行。

先来一个字符串表达式解析的流程图。

表达式字符串解析流程图

分数运算

分数运算没有复杂的算法,实际上就是新增一个 Fraction类 Fraction存储分子和分母,所有的从字符串表达式中解析得到的数字都不直接参与字符串解析的算法,而是 先初始化为 Fraction 的对象 ,再进行四则运算,因此,只要理清楚 分数的四则运算 约分 逻辑即可。其中,约分逻辑需要注意效率和正确性,因此下文也给出了笔者的约分流程图。

以下是Fraction分式类的类图,以及约分流程图。

fraction类图

Fraction类图

方法或属性 说明
Fraction::num 存储分子
Fraction::den 存储分母
Fraction::rule(Fraction $exp, int $op) 当前对象与$exp做$op运算,并将结果更新至当前对象
Fraction::ruleString(Fraction $exp, int $op) 当前对象与$exp做$op运算,并将结果更新至当前对象
Fraction::sum(Fraction $exp) 当前对象与$exp做加法运算,并将结果更新至当前对象
Fraction::sub(Fraction $exp) 当前对象与$exp做减法运算,并将结果更新至当前对象
Fraction::mul(Fraction $exp) 当前对象与$exp做乘
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值