设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 7989|回复: 17
打印 上一主题 下一主题

求最簡單代碼

[复制链接]
1#
发表于 2005-6-13 20:52:00 | 显示全部楼层

回复:(lzx-shmily)求最簡單代碼



其实就是求组合数,也可以使用递归算法。下面是优化一下原来的代码

Dim showstr As String

Dim totalA As Single

Dim A(6) As Single

Private Sub 命令0_Click()

Dim i As Integer

Dim j As Integer

Dim k As Integer

Dim l As Integer

Dim m As Integer

A(0) = 3.1

A(1) = 1.7

A(2) = 2

A(3) = 5.3

A(4) = 0.9

A(5) = 7.2

totalA = 10

For i = 0 To 5

  For j = i + 1 To 5

    For k = j + 1 To 5

      For l = k + 1 To 5

        For m = l + 1 To 5

            CountNum i, j, k, l, m

        Next

        CountNum i, j, k, l, 6

      Next l

      CountNum i, j, k, 6, 6

    Next k

    CountNum i, j, 6, 6, 6

  Next j

  CountNum i, 6, 6, 6, 6

Next i

MsgBox Replace(showstr, " + 0", "") & ";  totalA=" & Round(totalA, 2)

End Sub



Public Function CountNum(i As Integer, j As Integer, k As Integer, l As Integer, m As Integer)

      If Abs(A(i) + A(j) + A(k) + A(l) + A(m) - 10) = totalA Then

        showstr = showstr & ";  " & CSng(A(i)) & " + " & CSng(A(j)) & " + " & CSng(A(k)) & " + " & CSng(A(l)) & " + " & CSng(A(m))

      ElseIf Abs(A(i) + A(j) + A(k) + A(l) + A(m) - 10) < totalA Then

        totalA = Abs(A(i) + A(j) + A(k) + A(l) + A(m) - 10)

        showstr = CSng(A(i)) & " + " & CSng(A(j)) & " + " & CSng(A(k)) & " + " & CSng(A(l)) & " + " & CSng(A(m))

      End If

End Function

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
2#
发表于 2005-6-15 07:52:00 | 显示全部楼层
Public Sub PL()

Dim i As Integer, Total As Single, tmp As Single, Str As String, strTmp As String

    For i = 1 To 2 ^ 6 - 1

        strTmp = ((i And 2 ^ 5) / 2 ^ 5) * 3.1 & "+" & ((i And 2 ^ 4) / 2 ^ 4) * 1.7 & "+" & ((i And 2 ^ 3) / 2 ^ 3) * 2# & "+" & ((i And 2 ^ 2) / 2 ^ 2) * 5.3 & "+" & ((i And 2 ^ 1) / 2 ^ 1) * 0.9 & "+" & ((i And 2 ^ 0) / 2 ^ 0) * 7.2

        tmp = Abs(Eval(strTmp) - 10)

        If tmp < Total Or Total = 0 Then

            Total = tmp

            Str = strTmp

        ElseIf tmp = Total Then

            Str = Str & " or " & strTmp

        End If

    Next

    MsgBox Str & "=" & Total

End Sub

确实想不出更短的了。答案不是两组,而是三组:0+0+2+0+.9+7.2 or 0+1.7+2+5.3+.9+0 or 3.1+1.7+0+5.3+0+0=.1
3#
发表于 2005-6-15 21:37:00 | 显示全部楼层
如果只要求一组解,下面应该是最短的了:去掉Tmp中间变量,就剩一个循环和一条语句。Public Function Str(Optional i As Integer, Optional Tmp As String) As String

    For i = 1 To 2 ^ 6 - 1

        Tmp = (i And 32) / 32 * 3.1 & "+" & (i And 16) / 16 * 1.7 & "+" & (i And 8) / 8 * 2

        Tmp = Tmp & "+" & (i And 4) / 4 * 5.3 & "+" & (i And 2) / 2 * 0.9 & "+" & (i And 1) * 7.2

        Str = IIf((Abs(Eval(Tmp) - 10) < Abs(Eval(IIf(Str = "", "0", Str)) - 10)), Tmp, Str)

    Next

End Function下面是两个自定义获取和设置一个整数某一位的位操作函数,在使用一个整数保存多个开关量的时候可以用到,如用一个字段保存多个选项。另外使用此函数的话,上面的程序语句可以短一些:Public Function GetByte(Num As Long, i As Integer) As Long

    GetByte = (Num And 2 ^ i) / 2 ^ i

End FunctionPublic Function SetByte(Num As Long, i As Integer, val As Integer) As Long

    SetByte = IIf(val = 1, Num Or 2 ^ i, Num - (Num And 2 ^ i))

End Function

[建议把此帖转到技术竞赛栏目]
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-5-16 00:21 , Processed in 0.082028 second(s), 26 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表