其实网络上都有其他语言的代码,但是VB的不多。网上求一种解的代码多,但是求所有解的代码和程序不多。最近花了2天做了一个求24点所有解的VB小程序,算法无非都是穷举法。我解算的思路如下:
24点无非下列几种种解法:
1.(a符号b)符号(c符号d)形式 例如:(9-5)*(10-6)
2.((a符号b)符号c)符号d 形式 或者 d符号((a符号b)符号c)例如:((10-2)/2)*6 或者6*((10-2)/2)
3.(a符号(b符号c))符号d 形式 或者 d符号(a符号(b符号c))例如:(8/(4/2))*6或者8/(3-(8/3))
4. 无括号的情况包括在有括号情况里面, 例如4+2*5+10可以解成(4+10)+(2*5)
5. 交换a,b,c,d位置求解即可。
源代码:
Dim daan As Boolean '判定(a+b)+(c+d)是否有解
Dim s(1 To 4) As Integer '输入的四个数
Dim daan1 As Boolean '判定((a+b)+c)+d)是否有解
Dim dyjs As Integer '控制打印列数
Sub shuchu1(a1 As Integer, b1 As Integer, c1 As Integer, d1 As Integer, i1 As Integer, j1 As Integer, k1 As Integer) '子过程,以((a+b)+c)+d输出结果,ijk运算符号,abcd是四个数
Print "("; "("; a1;
If i1 = 1 Then
Print ; "+";
ElseIf i1 = 2 Then
Print ; "-";
ElseIf i1 = 3 Then
Print ; "×";
ElseIf i1 = 4 Then
Print ; "÷";
End If
Print ; b1; ")";
If j1 = 1 Then
Print ; "+";
ElseIf j1 = 2 Then
Print ; "-";
ElseIf j1 = 3 Then
Print ; "×";
ElseIf j1 = 4 Then
Print ; "÷";
End If
Print ; c1; ")";
If k1 = 1 Then
Print ; "+";
ElseIf k1 = 2 Then
Print ; "-";
ElseIf k1 = 3 Then
Print ; "×";
ElseIf k1 = 4 Then
Print ; "÷";
End If
Print ; d1; "="; 24; Space(10);
dyjs = dyjs + 1
If dyjs = 5 Then
dyjs = 0
Print
End If
End Sub
Sub shuchu2(a1 As Integer, b1 As Integer, c1 As Integer, d1 As Integer, i1 As Integer, j1 As Integer, k1 As Integer) '子过程,以d+((a+b)+c)输出结果,ijk运算符号,abcd是四个数
Print ; d1;
If k1 = 1 Then
Print ; "+";
ElseIf k1 = 2 Then
Print ; "-";
ElseIf k1 = 3 Then
Print ; "×";
ElseIf k1 = 4 Then
Print ; "÷";
End If
Print "("; "("; a1;
If i1 = 1 Then
Print ; "+";
ElseIf i1 = 2 Then
Print ; "-";
ElseIf i1 = 3 Then
Print ; "×";
ElseIf i1 = 4 Then
Print ; "÷";
End If
Print ; b1; ")";
If j1 = 1 Then
Print ; "+";
ElseIf j1 = 2 Then
Print ; "-";
ElseIf j1 = 3 Then
Print ; "×";
ElseIf j1 = 4 Then
Print ; "÷";
End If
Print ; c1; ")"; "="; 24; Space(10);
dyjs = dyjs + 1
If dyjs = 5 Then
dyjs = 0
Print
End If
End Sub
Sub shuchu3(a1 As Integer, b1 As Integer, c1 As Integer, d1 As Integer, i1 As Integer, j1 As Integer, k1 As Integer) '子过程,以(a+(b+c))+d输出结果,ijk运算符号,abcd是四个数
Print "("; a1;
If j1 = 1 Then
Print ; "+";
ElseIf j1 = 2 Then
Print ; "-";
ElseIf j1 = 3 Then
Print ; "×";
ElseIf j1 = 4 Then
Print ; "÷";
End If
Print ; "("; b1;
If i1 = 1 Then
Print ; "+";
ElseIf i1 = 2 Then
Print ; "-";
ElseIf i1 = 3 Then
Print ; "×";
ElseIf i1 = 4 Then
Print ; "÷";
End If
Print ; c1; ")"; ")";
If k1 = 1 Then
Print ; "+";
ElseIf k1 = 2 Then
Print ; "-";
ElseIf k1 = 3 Then
Print ; "×";
ElseIf k1 = 4 Then
Print ; "÷";
End If
Print ; d1; "="; 24; Space(10);
dyjs = dyjs + 1
If dyjs = 5 Then
dyjs = 0
Print
End If
End Sub
Sub shuchu4(a1 As Integer, b1 As Integer, c1 As Integer, d1 As Integer, i1 As Integer, j1 As Integer, k1 As Integer) '子过程,以d+(a+(b+c))输出结果,ijk运算符号,abcd是四个数
Print ; d1;
If k1 = 1 Then
Print ; "+";
ElseIf k1 = 2 Then
Print ; "-";
ElseIf k1 = 3 Then
Print ; "×";
ElseIf k1 = 4 Then
Print ; "÷";
End If
Print "("; a1;
If j1 = 1 Then
Print ; "+";
ElseIf j1 = 2 Then
Print ; "-";
ElseIf j1 = 3 Then
Print ; "×";
ElseIf j1 = 4 Then
Print ; "÷";
End If
Print ; "("; b1;
If i1 = 1 Then
Print ; "+";
ElseIf i1 = 2 Then
Print ; "-";
ElseIf i1 = 3 Then
Print ; "×";
ElseIf i1 = 4 Then
Print ; "÷";
End If
Print ; c1; ")"; ")"; "="; 24; Space(10);
dyjs = dyjs + 1
If dyjs = 5 Then
dyjs = 0
Print
End If
End Sub
Sub xingshi1(a As Integer, b As Integer, c As Integer, d As Integer) '判断(a+b)+(c+d)形式是否有解,并输出
Dim result1 As Single, result2 As Single, result As Single '(a+b)=result1,(c+d)=result2
Dim ms As Integer, ls As Integer '判断a,b,c,d是否相同,减少穷举次数
If a = b Then
ms = 1
Else
ms = 2
End If
If c = d Then
ls = 1
Else
ls = 2
End If
For i = 1 To 4
For j = 1 To 4
For k = 1 To 4
For l = 1 To ls
For m = 1 To ms
If i = 1 And m = 1 Then result1 = a + b
If i = 1 And m = 2 Then result1 = b + a
If i = 2 And m = 1 Then result1 = a - b '交换a,b位置
If i = 2 And m = 2 Then result1 = b - a '交换a,b位置
If i = 3 And m = 1 Then result1 = a * b
If i = 3 And m = 2 Then result1 = b * a
If i = 4 And m = 1 Then result1 = a / b
If i = 4 And m = 2 Then result1 = b / a
If j = 1 And l = 1 Then result2 = c + d
If j = 1 And l = 2 Then result2 = d + c
If j = 2 And l = 1 Then result2 = c - d '交换c,d位置
If j = 2 And l = 2 Then result2 = d - c