我刚进入大学时收到一个难题,由于当时缺乏数学知识,我无法解决它。多年来,我回到了这个难题,并能够确定至少一个解决方案,并且在我目前仍然缺乏数学知识的情况下,我能够确定这个难题包含一个由 10 个公式和 12 个未知数组成的待定系统。至少存在一种解决方案。我解决这个问题的最新尝试是通过暴力破解所有解决方案,利用 vba 的基本编程技能完成的。我的脚本能够找到我已有的解决方案,但确定任何其他解决方案的速度很慢(在脚本运行完成之前我的耐心就耗尽了)。
我尝试通过循环变量来求解多个方程,如果找到方程的解,则继续下一个循环。虽然这在思想上工作得很好,但实际上它需要每个变量都有一个循环,在本例中是 12 个变量,这使得过程非常缓慢。我尝试通过在循环中移动一些 if 语句来使其更快,但这并没有真正产生影响。我知道在彼此内部添加多个循环并不能产生好的代码,但我想不出更好的东西。
由于我缺乏编程和数学技能,我想不出比循环遍历每个变量更快的解决方案来解决这个难题。我希望能得到一些帮助。
我的代码:
For a = 1 To 100
For b = 1 To 100
If 10 - a + 38 + b * 42 = 114 Then
For c = 1 To 100
For d = 1 To 100
For e = 1 To 100
If c - 2 + d + 6 * e = 37 Then
For f = 1 To 100
For g = 1 To 100
If 50 - f * 3 - g / 5 = -4 Then
For h = 1 To 100
For j = 1 To 100
For k = 1 To 100
If h + 15 - j * 3 - k = 2 Then
For l = 1 To 1000
For m = 1 To 100
If 20 * l + 12 / m + 8 = 171 Then
If 10 + c * 50 + h + 20 = 186 Then
If a * 2 - f + 15 - l = 111 Then
If 38 - d * 3 - j + 12 = -28 Then
If b + 6 + g - 3 * m = 27 Then
If 42 * e - 5 - k - 8 = 70 Then
r = r + 1
With Worksheets("Sheet1")
.Cells(r, 5).Value = a
.Cells(r, 6).Value = b
.Cells(r, 7).Value = c
.Cells(r, 8).Value = d
.Cells(r, 9).Value = e
.Cells(r, 10).Value = f
.Cells(r, 11).Value = g
.Cells(r, 12).Value = h
.Cells(r, 13).Value = j
.Cells(r, 14).Value = k
.Cells(r, 15).Value = l
.Cells(r, 16).Value = m
.Cells(r, 4).Value = Format(Timer - t, "hh:mm:ss")
End With
End If
End If
End If
End If
End If
End If
Next m
Next l
End If
Next k
Next j
Next h
End If
Next g
Next f
End If
Next e
Next d
Next c
End If
Next b
Next a
在此示例代码中,我仅在 1 到 100 的范围内运行它,这在大约 15 分钟后给了我一个解决方案。产生所有解决方案的范围可能会花费太长时间。所以我在没有帮助的情况下陷入了困境。
简化某些方程是否被视为作弊?您可以根据其他变量定义 7 个变量,因此不必循环 12 个变量,而只需循环 5 个变量。
我尝试了你原来的方式,跑了3分钟就放弃了。我尝试使用简化的变量,只花了 4 秒。我也尝试了1到200和-1到100,但仍然只有1个解决方案。这些运行花费了不到一分钟的时间,因此如果您愿意等待,您可能会找到更多解决方案。
我还将您的 1 到 100 更改为变量,以便更轻松地扩展范围并测试负解。
Sub solve_problem()
intMIN = 1
intMAX = 150
Start = Now
For a = intMIN To intMAX
' For B = intMIN To intMAX
b = (a + 66) / 42
If 10 - a + 38 + b * 42 = 114 Then
For c = intMIN To intMAX
For d = intMIN To intMAX
For e = intMIN To intMAX
If c - 2 + d + 6 * e = 37 Then
For f = intMIN To intMAX
' For g = intMIN To intMAX
g = 270 - 15 * f
If 50 - f * 3 - g / 5 = -4 Then
' For h = intMIN To intMAX
h = 156 - (50 * c)
' For j = intMIN To intMAX
j = 78 - 3 * d
' For k = intMIN To intMAX
k = 42 * e - 83
If h + 15 - j * 3 - k = 2 Then
' For L = intMIN To intMAX
l = 84 * b - f - 228
' For m = intMIN To intMAX
m = 12 / (163 - 20 * l)
If 20 * l + 12 / m + 8 = 171 Then
If 10 + c * 50 + h + 20 = 186 Then
If a * 2 - f + 15 - l = 111 Then
If 38 - d * 3 - j + 12 = -28 Then
If b + 6 + g - 3 * m = 27 Then
If 42 * e - 5 - k - 8 = 70 Then
r = r + 1
With Worksheets("Sheet1")
.Cells(r, 5).Value = a
.Cells(r, 6).Value = b
.Cells(r, 7).Value = c
.Cells(r, 8).Value = d
.Cells(r, 9).Value = e
.Cells(r, 10).Value = f
.Cells(r, 11).Value = g
.Cells(r, 12).Value = h
.Cells(r, 13).Value = j
.Cells(r, 14).Value = k
.Cells(r, 15).Value = l
.Cells(r, 16).Value = m
.Cells(r, 4).Value = Format(Now - Start, "hh:mm:ss")
End With
End If
End If
End If
End If
End If
End If
' Next m
' Next L
End If
' Next k
' Next j
' Next h
End If
' Next g
Next f
End If
Next e
Next d
Next c
End If
' Next B
Next a
r = r + 1
Worksheets("Sheet1").Cells(r, 4).Value = Format(Now - Start, "hh:mm:ss")
End Sub
这是隔离变量的工作