找工作投简历的时候遇到这样一道题,“如何通过基础的解析字符串的方式去求解一元一次方程,而不通过工具包或者内置函数等计算?”,即输入任意一个一元一次函数(如:"((2x+1)*3+1)+(3+2x)=5x+3+(2x+1)"等等  ),当时觉得有趣,于是想好好做一下~
    最开始的时候想直接从表达式下手,但是由于有括号对优先级的影响,使得考虑的情况实在是比较复杂,于是便想到分别利用两个栈对表达式求解(data栈用来存储数字{'0','1','2','3','4','5','6','7','8','9','x'},operation栈用来存储操作运算符{'+','-','*','/'},对于利用栈计算算术表达式,这篇博客有详细讲解:https://blog.csdn.net/xyh1re/article/details/81634236。而对于计算x解析解而言,为了方便计算,需要将表达式转换为[a,b]**[x0,x1].T的形式(即a表示常数项,b表示一次项),这里又要分几种情况:
    (1)当操作符为{‘+’,‘-’}时,即形如(ax+b),这里经转换得到: np.array([0,a])+np.array([b,0])=np.array([b,a])
    (2)当操作符为{‘*’,‘/’}时,即形如(ax+b)*c,这里经转换得到:np.array([b,a])*np.array([c,c]),注意此时的转换方式有变化(不是np.array([c,0]))。
    详细的代码如下:

# 将表达式进行标准化,即[a,b]*(x0,x1).T的形式
# 利用两个栈实现表达式的运算
# operation 保存运算符
# data 保存数字
# 遍历表达式,若为数字则直接入栈data,若为符号分几种情况入栈opration:
#     (1)栈为空
#     (2)栈顶为左括号
#     (3)该符号为左括号
#     (4)该符号优先级高于栈顶符号
# 若符号为右括号,则operation输出栈顶符号,从data输出两个数运算再入栈data,
# 直到栈顶为左括号,然后左括号出栈,若符号优先级低于栈顶元素,则重复计算步骤,
# 直到栈为空或栈顶为左括号。
import numpy as np
number={'0','1','2','3','4','5','6','7','8','9','x'}def data_process1(string):   #如:5xif not isinstance(string,str):return stringa=0b=0index=-1for i in range(len(string)):if string[i]=="x":index=iif index==-1:       # 5a=float(string)b=0.0elif index==0:     # xa=0.0b=1.0elif index==1:     # -x,2xif string[0]=="-":a=0.0b=-1.0else:a=0.0b=float(string[0])else:               # 5xa=0.0b=float(string[:index])return np.array([a,b])def data_process2(string):   #如:5xif not isinstance(string,str):return stringa=0b=0index=-1for i in range(len(string)):if string[i]=="x":index=iif index==-1:       # 5a=float(string)b=float(string)elif index==0:     # xa=0.0b=1.0elif index==1:     # -x,2xif string[0]=="-":a=0.0b=-1.0else:a=0.0b=float(string[0])else:               # 5xa=0.0b=float(string[:index])return np.array([a,b])def num_operation(num1,num2,op):if op=="+":return data_process1(num1)+data_process1(num2)if op=="-":return data_process1(num1)-data_process1(num2)if op=="*":return data_process2(num1)*data_process2(num2)if op=="/":return data_process2(num1)/data_process2(num2)def caculate(data,operation):op=operation.pop()num2=data.pop()num1=data.pop()data.append(num_operation(num1,num2,op))def function(s):data=[]operation=[]i=0while i<len(s):if s[i] in number:       #数字直接入栈datastart=iwhile i+1 <len(s) and s[i+1] in number:i+=1data.append(s[start:i+1])#栈为空或者栈顶为左括号,入栈operationelif not operation or operation[-1]=="(":operation.append(s[i])#该符号为左括号或优先级高于栈顶元素,入栈operationelif s[i]=="(" or (s[i] in {"*","/"} and operation[-1] in {"+","-"}):operation.append(s[i])#该符号为右括号,则operation出栈,data出栈进行计算elif s[i]==")":while operation[-1]!="(":caculate(data,operation)operation.pop()#该符号优先级不如栈顶高时,operation出栈,data出栈进行计算,直到栈为空或栈顶为左括号else:while operation and (operation[-1] in {"*","/"} and s[i] in {"+","-"}):if operation[-1]=="(":breakcaculate(data,operation)operation.append(s[i])i+=1while operation:caculate(data,operation)answer=data.pop()if isinstance(answer,str):return data_process1(answer)return answerif __name__ == '__main__':s=input() # 输入合法的表达式,如  1+((2x+3)*2+1)+2x=5x  请勿带引号输入! 只能一次项!# s="1+((2x+3)*2+1)+2x=5x"left, right = s.split("=")lf=function(left)rt=function(right)result=lf-rtanswer=-result[0]/result[1]print("the answer is:",answer)

一元一次方程的解析解(基本字符串处理)相关推荐

  1. 160个Crackme030之一元一次方程

    文章目录 查壳 分析程序 算法分析 写出注册机 校验结果 查壳 目标程序是VB写的,序列号保护方式,难度为一颗星 分析程序 随便输入一个序列号,来到字符串的错误提示处 找到跳转到错误提示的地方 跟过去 ...

  2. 解一元一次方程的那些坑(记洛谷P1022题RE的经历,Java语言描述)

    important!!! 遇到RE不可怕,纯粹的RE还行(后面没有WA的话,可能你的算法本身没错). 这固然会使得我们困惑,但我们只需要记得最常见的几种RE,加以分析,给一些脑洞大的测试样例就一般可以 ...

  3. php编写解一元一次方程,解释C语言(逐句) 解一元一次方程的 怎样用C语言编一个解一元二次方程的程序?...

    导航:网站首页 > 解释C语言(逐句) 解一元一次方程的 怎样用C语言编一个解一元二次方程的程序? 解释C语言(逐句) 解一元一次方程的 怎样用C语言编一个解一元二次方程的程序? 相关问题: 匿 ...

  4. java解一元一次方程

    复旦大学上机题(二) 解方程.给定一个字符串,代表一个一元一次方程.如果有解求解,输出格式"x=数字" ,如果解的个数无穷,输出 "infinite solutions& ...

  5. 计算器求解一元一次方程

    链接:https://ac.nowcoder.com/acm/contest/19306/1043 来源:牛客网 题目描述 NCL是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托 ...

  6. Python解一元一次方程和一元二次方程,输出数学形式和小数形式

    Python解一元一次方程和一元二次方程,输出数学形式和小数形式 一元一次方程 一元二次方程 完整代码 运行结果 创建函数: def eqt(c,b,a=0): 其中,a.b.c分别是二次项系数.一次 ...

  7. (2018-2)解一元一次方程

    原文出处 https://blog.csdn.net/vir_lee/article/details/80377378#comments 题目描述: 解方程,给定一个字符串,代表一个一元一次方程.如果 ...

  8. 2018复旦大学计算机硕士招生复试上机题(2)-解一元一次方程

    题目要求: 解方程,给定一个字符串,代表一个一元一次方程.如果有解求解,输出格式"x=数字",如果解的个数无穷,输出 "infinite solutions". ...

  9. python3 解一元一次方程

    Copyright © 2018 Joyce_BY All rights reserved. Contact by Yagnes126@gmail.com 题目 输入一串字符串表示一个一元一次方程,计 ...

最新文章

  1. 《预训练周刊》第27期:谷歌发布最新看图说话模型、GitHub:平台上30%的新代码受益于AI助手Copilot...
  2. 李航-统计学习方法-笔记-1:概论
  3. 中国航天将与人工智能技术携手 未来可期
  4. 【发现问题】IDEA设置全局新创建文件默认换行符
  5. 【项目管理】阿尔法项目经理的时间投入启示
  6. Segment Advisor
  7. CPU负载均衡之WALT学习
  8. 全国计算机b类一级考试试题题库,全国计算机等级考试模拟题:一级B试题(一)...
  9. 网络连接正常,IE不能打开网页的全面解决方法
  10. gephi使用教程pdf
  11. 三阶交调截取点的测量
  12. 分享一个超详细的数据分析案例【Python】附ABTest详细介绍
  13. zend framwork黑箱测试
  14. 天善智能丨国产商业智能BI这20年(1997~2017)
  15. 【C/C++】【面经】2022 网易互娱面经( 游戏客户端方向 )(更新:一面;二面;)
  16. 怎样安装win服务器系统,win服务器系统安装教程
  17. c语言实验--九九乘法表,C语言程序设计实验四 参考答案.doc
  18. 14-射频校准的原理和设置
  19. 云计算与大数据处理技术_云计算与大数据处理
  20. javaweb复习笔记总结

热门文章

  1. 电解电容在电子电路中设计使用时要注意什么?
  2. 百度签约重庆高院 ABC推动智慧法院建设
  3. android 多线程下载文件大小不对的问题
  4. ESP8266采集多个传感器数据通过WIFI上传到本地数据库(风速、风向、CO、颗粒物)
  5. 2019.12.13学习记录
  6. Windows下虚拟机安装Mac OS X ----- VM12安装Mac OS X 10.11
  7. ASUS华硕笔记本电脑天选2-FX506HCB11400原装出厂Windows10系统原厂OEM系统
  8. mescroll-uni上拉加载失效
  9. 自定义springboot组件--基于模板模式对原生springboot的rabbitmq组件进行扩展
  10. 提高运算放大器输出功率