Office中國(guó)論壇/Access中國(guó)論壇

 找回密碼
 注冊(cè)

QQ登錄

只需一步,快速開始

12
返回列表 發(fā)新帖
樓主: lzx-shmily
打印 上一主題 下一主題

求最簡(jiǎn)單代碼

[復(fù)制鏈接]
11#
發(fā)表于 2005-6-13 21:38:00 | 只看該作者
貼一個(gè)我自己做的,肯定不是最優(yōu)。Sub abc(a1 As Double, a2 As Double, a3 As Double, a4 As Double, a5 As Double, a6 As Double, a0 As Double)

Dim i As Byte, j As Byte, k As Byte, l As Byte, m As Byte, n As Byte

Dim gshi As String, zhi As Double, oldzhi As Doubleoldzhi = a0

For i = 0 To 1

    For j = 0 To 1

        For k = 0 To 1

            For l = 0 To 1

                For m = 0 To 1

                    For n = 0 To 1

                        ai = a1: If i = 0 Then ai = 0

                        aj = a2: If j = 0 Then aj = 0

                        ak = a3: If k = 0 Then ak = 0

                        al = a4: If l = 0 Then al = 0

                        am = a5: If m = 0 Then am = 0

                        an = a6: If n = 0 Then an = 0

                        zhi = Abs(ai + aj + ak + al + am + an - a0)

                        If zhi < oldzhi Then

                           oldzhi = zhi

                           gshi = ai & "+" & aj & "+" & ak & "+" & al & "+" & am & "+" & an & " = " & ai + aj + ak + al + am + an

                        End If

                    Next n

                Next m

            Next l

        Next k

    Next j

Next i

gshi = Replace(gshi, "+0+", "+", , 4)

gshi = Replace(gshi, "+0=", "=")

If Left(gshi, 2) = "0+" Then gshi = Right(gshi, Len(gshi) - 2)

MsgBox gshi

End Sub

調(diào)用:abc 3.1, 1.7, 2, 5.3, 0.9, 7.2, 10     '6個(gè)計(jì)算數(shù)及1個(gè)接近數(shù)
12#
發(fā)表于 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

確實(shí)想不出更短的了。答案不是兩組,而是三組: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
13#
發(fā)表于 2005-6-15 15:35:00 | 只看該作者
高手
14#
發(fā)表于 2005-6-15 19:35:00 | 只看該作者
高!!,非一般思維,IQ要達(dá)120以上了[em05]
15#
發(fā)表于 2005-6-15 21:16:00 | 只看該作者
由以上想到ublic Sub GetNumber()

Dim I, J, K, L, M, N As Integer, Total As Single, str As String, tmp As Double

For I = 0 To 1: For J = 0 To 1: For K = 0 To 1: For L = 0 To 1: For M = 0 To 1: For N = 0 To 1

strTmp = I * 3.1 & "+" & J * 1.7 & "+" & K * 2# & "+" & L * 5.3 & "+" & M * 0.9 & "+" & N * 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 N: Next M: Next L: Next K: Next J: Next I

MsgBox str & "=" & Total

End Sub[em05][em05][em05]
16#
發(fā)表于 2005-6-15 21:37:00 | 只看該作者
如果只要求一組解,下面應(yīng)該是最短的了:去掉Tmp中間變量,就剩一個(gè)循環(huán)和一條語句。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下面是兩個(gè)自定義獲取和設(shè)置一個(gè)整數(shù)某一位的位操作函數(shù),在使用一個(gè)整數(shù)保存多個(gè)開關(guān)量的時(shí)候可以用到,如用一個(gè)字段保存多個(gè)選項(xiàng)。另外使用此函數(shù)的話,上面的程序語句可以短一些: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

[建議把此帖轉(zhuǎn)到技術(shù)競(jìng)賽欄目]

點(diǎn)擊這里給我發(fā)消息

17#
發(fā)表于 2005-6-17 07:01:00 | 只看該作者

求最簡(jiǎn)單代碼

非常不錯(cuò), 我現(xiàn)轉(zhuǎn)到競(jìng)賽欄目
18#
發(fā)表于 2005-8-3 18:53:00 | 只看該作者
以下是引用Trynew在2005-6-15 13:37:00的發(fā)言:



如果只要求一組解,下面應(yīng)該是最短的了:去掉Tmp中間變量,就剩一個(gè)循環(huán)和一條語句。

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

下面是兩個(gè)自定義獲取和設(shè)置一個(gè)整數(shù)某一位的位操作函數(shù),在使用一個(gè)整數(shù)保存多個(gè)開關(guān)量的時(shí)候可以用到,如用一個(gè)字段保存多個(gè)選項(xiàng)。另外使用此函數(shù)的話,上面的程序語句可以短一些:

Public Function GetByte(Num As Long, i As Integer) As Long

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

End Function

Public 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



[建議把此帖轉(zhuǎn)到技術(shù)競(jìng)賽欄目]

這個(gè)方法確實(shí)是最簡(jiǎn)單的,遞歸的代碼長(zhǎng)度和執(zhí)行效率都是很不錯(cuò)的。
12
返回列表 發(fā)新帖
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則

QQ|站長(zhǎng)郵箱|小黑屋|手機(jī)版|Office中國(guó)/Access中國(guó) ( 粵ICP備10043721號(hào)-1 )  

GMT+8, 2024-10-23 08:38 , Processed in 0.116722 second(s), 30 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回復(fù) 返回頂部 返回列表