| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1959 人关注过本帖
标题:24 点问题
取消只看楼主 加入收藏
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:0 
模块完整的代码:
程序代码:
Option Explicit

Public Type T24type
    s As String
    v As Long
End Type

Public Function Test24_2(a As Long, b As Long, c As Long, d As Long) As String

Dim r1(4) As T24type, r2(4) As T24type, r3(4) As T24type
Dim l1 As T24type, l2 As T24type
Dim l3 As T24type, l4 As T24type
Dim i As Long, j As Long, m As Long
Dim s As String

'第一个数
l1.s = CStr(a)
l1.v = a
'第二个数
l2.s = CStr(b)
l2.v = b
'第三个数
l3.s = CStr(c)
l3.v = c
'第四个数
l4.s = CStr(d)
l4.v = d

'第一个数与第二个数计算
Call operation(l1, l2, r1)

'第一分支,第1、2数运算后与第3、4数运算

'第三个数与第四个数计算
Call operation(l3, l4, r2)
For i = 1 To 4
    If r1(i).v > 0 Then
        For j = 1 To 4
            If r2(j).v >= 0 Then
                Call operation(r1(i), r2(j), r3)
                For m = 1 To 4
                    If r3(m).v = 24 Then
                        s = s & r3(m).s & " = 24" & vbCrLf
                    End If
                Next m
            End If
        Next j
    End If
Next i

'第二分支,第1、2数运算后与第3数运算,再与第4数运算
For i = 1 To 4
    If r1(i).v >= 0 Then
        Call operation(r1(i), l3, r2)
        For j = 1 To 4
            If r2(j).v >= 0 Then
                Call operation(r2(j), l4, r3)
                For m = 1 To 4
                    If r3(m).v = 24 Then
                        s = s & r3(m).s & " = 24" & vbCrLf
                    End If
                Next m
            End If
        Next j
    End If
Next i

'先第2、3数运算后,再与第1数运算,第4数运算。
Call operation(l2, l3, r1)
For i = 1 To 4
    If r1(i).v > 0 Then
        Call operation(l1, r1(i), r2)
        For j = 1 To 4
            If r2(j).v > 0 Then
                Call operation(r2(j), l4, r3)
                For m = 1 To 4
                    If r3(m).v = 24 Then
                        s = s & r3(m).s & " = 24" & vbCrLf
                    End If
                Next m
            End If
        Next j
    End If
Next i


'去掉括号之间的空格
s = Replace(s, "( (", "((")
'去多余的空格
Do
    i = Len(s)
    s = Replace(s, "  ", " ")
Loop While Len(s) <> i

'去重
Dim fj() As String
'分行
fj = Split(s, vbCrLf)

'扫描
For i = 1 To UBound(fj)
    For j = i + 1 To UBound(fj)
        If fj(i) = fj(j) Then       '扫描到后面有相同的
            fj(j) = ""              '后面的清空
        End If
    Next j
Next i
'重新组合,不能使用 join 函数是因为有空行在
s = ""
For i = 0 To UBound(fj)
    If Len(fj(i)) > 0 Then
        s = s & fj(i) & vbCrLf
    End If
Next i

Test24_2 = s

End Function

Public Sub operation(a As T24type, b As T24type, r() As T24type)

Dim t As Single

'加法
r(1).v = a.v + b.v
r(1).s = "( " & a.s & " + " & b.s & " )"

'减法,不考虑负数
If a.v > b.v Then
    r(2).v = a.v - b.v
    r(2).s = "( " & a.s & " - " & b.s & " )"
Else
    r(2).v = -1
End If

'乘法
r(3).v = a.v * b.v
'r(3).s = "( " & a.s & " * " & b.s & " )"
r(3).s = "  " & a.s & " * " & b.s & "  "

'除法,只允许整除
If a.v >= b.v And b.v > 0 Then
    If a.v Mod b.v = 0 Then
        r(4).v = a.v / b.v
'        r(4).s = "( " & a.s & " / " & b.s & " )"
        r(4).s = "  " & a.s & " / " & b.s & "  "
    Else
        r(4).v = -1
    End If
    
Else
    r(4).v = -1
End If

End Sub


[ 本帖最后由 风吹过b 于 2015-6-17 20:31 编辑 ]

授人于鱼,不如授人于渔
早已停用QQ了
2015-06-17 10:54
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:0 
你看一下我 19楼 的调用代码,我是调用了 24次。

我函数分工∶调用过程中完成变换,test24 完成当前4个数的组合,然后另一个函数负责计算。

授人于鱼,不如授人于渔
早已停用QQ了
2015-06-17 11:27
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:0 
经检查, 代码里变量写错了。
 (( 5 + 7 ) - 8 ) * 6 = 24
 (( 7 + 5 ) - 8 ) * 6 = 24
 8 * 6 / ( 7 - 5 ) = 24

这行:
            Call operation(r1(i), r2(j), r3)
写成
            Call operation(r1(j), r2(j), r3)
了,上午那个时候是没时间了,没怎么仔细检查。郁闷。

授人于鱼,不如授人于渔
早已停用QQ了
2015-06-17 13:43
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:0 
好吧,还是粗心造成的。
二个地方有问题。
1、这里判断与循环的顺序有问题
'第三个数与第四个数计算
Call operation(l3, l4, r2)
For i = 1 To 4
    For j = 1 To 4
        If r1(i).v >= 0 And r2(i).v >= 0 Then
            Call operation(r1(j), r2(j), r3)
            For m = 1 To 4
                If r3(m).v = 24 Then
                    s = s & r3(m).s & " = 24" & vbCrLf
                End If
            Next m
        End If
    Next j
Next i
改为:
'第三个数与第四个数计算
Call operation(l3, l4, r2)
For i = 1 To 4
    If r1(i).v > 0 Then
        For j = 1 To 4
            If r2(j).v >= 0 Then
                Call operation(r1(i), r2(j), r3)
                For m = 1 To 4
                    If r3(m).v = 24 Then
                        s = s & r3(m).s & " = 24" & vbCrLf
                    End If
                Next m
            End If
        Next j
    End If
Next i

2、'重新组合,不能使用 join 函数是因为有空行在
s = ""
For i = 1 To UBound(fj)
应该是:
'重新组合,不能使用 join 函数是因为有空行在
s = ""
For i = 0 To UBound(fj)
原来的代码把 第一个 结果给抛弃了。

-------------------------
 6 * 8 / ( 9 - 7 ) = 24
 6 / ( 9 - 7 ) * 8 = 24
 8 * 6 / ( 9 - 7 ) = 24
 8 / ( 9 - 7 ) * 6 = 24
-------------------------
 6 * ( 7 + 9 ) / 4 = 24
 6 * ( 9 + 7 ) / 4 = 24
 ( 7 + 9 ) * 6 / 4 = 24
 ( 7 + 9 ) / 4 * 6 = 24
 ( 9 + 7 ) * 6 / 4 = 24
 ( 9 + 7 ) / 4 * 6 = 24
--------------------------
 ( 9 - 7 / 7 ) * 3 = 24
 ( 9 - 7 / 7 ) * 3 = 24

授人于鱼,不如授人于渔
早已停用QQ了
2015-06-17 20:29
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:0 
lianyicq 的代码 写的很精练,比我的 优化好多了,占用内存也比我的小。
建议 lianyicq 的代码写点注释进去,我看起来都有点吃力。看了好几遍,跟踪了才大体上搞清楚运行流程。

特别这一段:
    For i = m To n
      swap a(m), a(i)
      permutation a(), m + 1, n
      swap a(m), a(i)
    Next
比我傻傻的写 24 行 精练多了。

授人于鱼,不如授人于渔
早已停用QQ了
2015-06-17 20:48
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:0 
发现重复数据,郁闷之极。
经过调试,程序流程有问题, 去重代码只征对 一组数据 起作用,而不是对 24组数据同时起作用,所以输入相同数据时,我的代码还是会出现相同的数据。

需要去重代码段,从 运算模块 移到 调用 模块里去。


----------------------------
新手多调试程序吧。只有调试程序,才知道 错误出在什么地方。

代码编写 只占整个工作的小部分,大头是算法规划,另一部分就是 调试。
我最开始,算法规划不行, 虽然结果大体上对了,但错误的结果无法排除,这就是算法规划的失误。
然后修改过了算法,代码 写起来,很简单,但组合起来,就是BUG到处都是,经过调试,才能知道如何去修改错误,去除BUG。

授人于鱼,不如授人于渔
早已停用QQ了
2015-06-17 21:02
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:0 
好吧,我来解释一下,核心运算调用代码是这个。
          If operate(operator3, operate(operator2, operate(operator1, a(1), a(2)), a(3)), a(4)) = 24 Then
            List1.AddItem "((" & a(1) & convert(operator1) & a(2) & ")" & convert(operator2) & a(3) & ")" & convert(operator3) & a(4)
          End If

operate(operator3, _                    '第三次调用
   operate(operator2, _                 '第二次调用
   operate(operator1, a(1), a(2)_       '第一次调用  从右到左,先计算 1 和 2     
   ), a(3) _        第二次调用的第二个参数:再计算 1和2  与 3
   ), a(4) )        第三镒调用的第二个参数:最后再 和 4 进行计算

授人于鱼,不如授人于渔
早已停用QQ了
2015-06-18 09:16
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:0 
我英文不行。
2级才考 31 分。

授人于鱼,不如授人于渔
早已停用QQ了
2015-06-18 11:52
快速回复:24 点问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.139378 second(s), 8 queries.
Copyright©2004-2025, BC-CN.NET, All Rights Reserved