概述
最近在做笔试题的时候遇到的一道题,挺有意思的贴出来和大佬讨论一下(常规的做法,不保证全对)
- 题目要求:
- 给两个方程,字符串格式给出,保证系数为整数。如6x-7+3y=2-5x和
-5+x+y=8-x,保证有解且为整数。- 输入:两个方程;输出x,y的解,列表形式给出。如[1,2]表示x=1,y=2。
- 整体思路:
- 字符串提取x,y,常数项( c )的系数,使用哈希表实现
- 考虑到给定的方程需要化简,因此第一步要化简等号左右两端的方程,并获取系数,并存放在字典中,移到等式一端,之后合并字典则6x-7+3y=2-5x化简结果为{x:11, y:3, c:-9}
- 拿得到的系数使用消元法求解最终解
代码如下:该实现共包含三个函数:
transDict:用于获取参数,把给定的6x-7+3y=2-5x等号两端化简成两个字典
simplify:化简方程,调用transDict,化简整个参数为一个包含了整个方程系数的字典。
linearEquation:求解方程,消元法
import collections
class Solution:
def transDict(self, equation):
dictE = collections.defaultdict(int) # 默认字典类型,key:x,y,c对应的value为整形
sign, value = 1, 0 #一个符号标志,一个值标志
if equation[0] == '-': # 判断第一个是否是负号
start = 1
sign = -1
else:
start = 0
size = len(equation)
for i in range(start, size):
if equation[i] in '-+': # 第二个负号,参数写入字典
value *= sign
sign = 1
dictE['c'] += value # 常数项系数
value = 0
if equation[i] == '-':# 提取下一个符号
sign = -1
elif equation[i] in 'xy': # 提取x,y系数
if not value: # x,y前面没系数,设为1
value = 1
value *= sign
sign = 1
if equation[i] == 'x': # 更新字典
dictE['x'] += value
if equation[i] == 'y':
dictE['y'] += value
value = 0
elif equation[i].isdigit(): # 大于9的数加和
value = value * 10 + int(equation[i])
if i == size - 1:
value *= sign
dictE['c'] += value
return dictE
def simplify(self, equation):
equation = equation.split('=')
leftE, rightE = equation[0], equation[1]
dictLeft = self.transDict(leftE) # 得到等式左边的字典
dictRight = self.transDict(rightE) # 得到等式右边的字典
for key, val in dictLeft.items(): # 合并
dictLeft[key] -= dictRight[key]
return dictLeft
def linearEquation(self, equation1, equation2): # 消元法求解
eDict1 = self.simplify(equation1)
eDict2 = self.simplify(equation2)
if eDict1['y'] != eDict2['y']:
value = eDict2['y'] / eDict1['y']
eDict1['y'] = eDict2['y']
eDict1['x'] *= value
eDict1['x'] -= eDict2['x']
eDict1['c'] *= value
eDict1['c'] -= eDict2['c']
x = -eDict1['c'] / eDict1['x']
y = (-eDict2['c'] - eDict2['x'] * x) // eDict2['y']
return [int(x), int(y)]
'''
这里也可以用[线性代数](https://baike.baidu.com/item/%E4%BA%8C%E5%85%83%E4%B8%80%E6%AC%A1%E6%96%B9%E7%A8%8B%E7%BB%84/7594389#2)知识求解
ax+by=e
cx+dy=f
x = (d*e-b*f)/(ad-bc)
y = (a*f-c*e)/(ad-bc)
'''
if __name__ == '__main__':
s = Solution()
while 1: # 循环测试
equation1 = input()
equation2 = input()
print(s.linearEquation(equation1, equation2))
'''
x+3y=9
2x+y=13
6x-7+3y=2-5x
-5+x+y=8-x
'''
最后
以上就是满意眼神为你收集整理的python 求解一元二次方程组的全部内容,希望文章能够帮你解决python 求解一元二次方程组所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复