如何使用Python解决这个数学谜题?

5
   A + B = 8
   B + D = 8
   A + C = 13
   C - D = 6

如何找到A、B、C和D的值?

我假设这些值是正整数,然后进行了以下操作:

   a = range(0,14)
   b = c = d = a
   for i in a:
     for x in b:
      for y in c:
        for z in d:
          if (a[i] + b[x] == 8 and a[i] + c[y] == 13 and b[x] + d[z] == 8 and c[y]-d[z]==6):
            print(a[i],b[x],c[y],d[z])

但这并不起作用。即使我将范围扩展到 a = range(-100,100)

在手动解方程时(借助谷歌的帮助),我知道涉及到浮点数,例如 A = 3.5 等。

但是如何使用Python解决它。


1
当你使用 i in list 时,i 获取的是列表中的元素,而不是索引。你不需要使用 a[i],只需使用 i 即可。 - Barmar
1
如果结果可以是浮点数,你不能使用搜索来解决问题,因为要搜索的数字几乎是无限的。你需要使用逻辑来解决它。 - Barmar
2
例如,A+B = 8B+D = 8表明A == D - Barmar
1
使用 numpy.linalg.solve() 函数。 - Gribouillis
Python有很多种方法来解决这个问题,因为解决线性方程组的方法有很多种。请告诉我们您所了解的数学知识,然后我们可以告诉您一个适当的解决方案。您是否了解矩阵,包括它们的逆和/或行列式?您是否了解高斯或高斯-约旦消元?还是您想要一个黑盒子解决方案(您不理解其工作原理)?等等。现在,您的问题太广泛了。 - Rory Daulton
显示剩余3条评论
2个回答

8

如果你了解线性代数,你可以将问题构建为一组方程,然后使用一个名为numpy的免费且流行的库来解决问题(感谢@Griboullis):

import numpy as np

A = [[1, 1, 0, 0], 
     [0, 1, 0, 1], 
     [1, 0, 1, 0], 
     [0, 0, 1, -1]]
b = [8, 8, 13, 6]
answer = np.linalg.solve(A, b)

如果您想了解此Python解决方案背后的矩阵数学/线性代数知识,可以查看https://www.mathsisfun.com/algebra/systems-linear-equations-matrices.html

1
天啊……这真是太神奇了!我得去重新学习矩阵:))) - Wlad
谢谢你的回答!它给我留下了深刻的印象,但由于简洁明了,我不得不优先选择Bill的答案。请查看我在Bill的答案下面的评论。 - Wlad

6

没有必要学习矩阵理论(至少对于这个内容来说不需要)。

>>> from sympy import *
>>> var('A  B C D')
(A, B, C, D)
>>> solve([A+B-8,B+D-8,A+C-13,C-D-6])
{B: 9/2, D: 7/2, C: 19/2, A: 7/2}

你只需要将每个方程式例如A+B=8 转化成A+B-8=0的形式,然后省略 '=0' 部分。


老实说,这就是我所希望的答案类型,因为这正是作为“仅仅是用户”而不是开发人员喜欢Python的原因 - 我不需要重新发明轮子!对于几乎任何问题,似乎都有一个解决它的库。我想将这个答案标记为被接受的答案,因为即使对于初学者来说,这种方法也非常直观,不需要了解矩阵或精通数学(虽然矩阵看起来很酷也很令人印象深刻!)。谢谢Bill! - Wlad
非常欢迎,Tset。现在我希望我能声称 sympy 的任何部分都是我自己的工作。但事实上我只是一个用户而已。 - Bill Bell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接