最近在做笔试题的时候遇到的一道题,挺有意思的贴出来和大佬讨论一下(常规的做法,不保证全对)
- 题目要求:
- 给两个方程,字符串格式给出,保证系数为整数。如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:求解方程,消元法
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93import 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内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复