設(shè)為首頁收藏本站Access中國

Office中國論壇/Access中國論壇

 找回密碼
 注冊

QQ登錄

只需一步,快速開始

123
返回列表 發(fā)新帖
樓主: tanhong
打印 上一主題 下一主題

趣味找數(shù)字

[復(fù)制鏈接]
21#
發(fā)表于 2009-2-1 21:29:01 | 只看該作者
方法三:用程序來解決.

Option Explicit

Public Sub test()
    Dim fArray() As Single
    Dim nTotalNumberCnt As Integer
    nTotalNumberCnt = Sheet1.UsedRange.Rows.Count


    ReDim fArray(nTotalNumberCnt)

    Dim i As Integer
    Dim j As Integer
    Dim k As Integer
   
    For i = 1 To nTotalNumberCnt
        fArray(i) = Sheet1.Cells(i, 1).Value
    Next i
   
    Dim fSum As Single
   
    fSum = 768.68
   
    Debug.Print "begin ......"
   
    For i = 1 To nTotalNumberCnt - 2
        For j = i + 1 To nTotalNumberCnt - 1
            For k = j + 1 To nTotalNumberCnt
                If fArray(i) + fArray(j) + fArray(k) = fSum Then
                    Debug.Print i; fArray(i), j; fArray(j), k; fArray(k)
                End If
            Next k
        Next j
    Next i
   
    Debug.Print "end ......"
End Sub




******************
*  一切皆有可能  *
******************

QQ群 48866293 / 12035577 / 7440532 / 13666209
22#
發(fā)表于 2009-2-23 20:41:37 | 只看該作者
本帖最后由 ljw990485 于 2009-2-23 21:01 編輯

找3個數(shù)就好辦,窮舉也很快,
option base 1
dim i as integer,j as integer,k as integer,A() as double,Target as double
dim t as double
n=?多少個就輸入多少吧
Redim A(n),自己寫程序輸入這n個數(shù)和目標(biāo)數(shù)Target
for i=1 to n-2
    for j=i+1 to n-1
        t=A(i)+A(j)
        for k=j+1 to n
           if abs(t+A(k)-Target)<1.0e-10 then
               輸出 i,j,k,只找一組的話就結(jié)束
        endif
  多個next
以上程序循環(huán)次數(shù)
1)給定i,j
k循環(huán) n-(j+1)+1=n-j次
2)故給定i后,j,k循環(huán)次數(shù)為
[n-(i+1)]+[n-(i+2)]+...+1=(n-i)(n-i-1)/2=(n-i)^2/2-(n-i)/2
3)最大循環(huán)次數(shù)
[(n-1)^2+...+2^2]/2-[(n-1)+...+2]/2
=n(n-1)(n-2)/6=O(n^3/6)
n=1000時,最大循環(huán)數(shù)為166167000,不算大,關(guān)鍵是運算非常簡單
23#
發(fā)表于 2009-2-23 20:43:33 | 只看該作者
如果用0-1規(guī)劃的方法,也可以,但可能會帶來誤差的問題
而窮舉的方法只有2個加法,舍入誤差的影響比較小
24#
發(fā)表于 2009-2-23 21:09:52 | 只看該作者
本帖最后由 ljw990485 于 2009-2-25 00:04 編輯

靠,程序一樣的

不過有一個地方不一樣,大家看出來了嗎?

fArray(i) + fArray(j) + fArray(k) = fSum

1)浮點數(shù)不能這樣判斷是否相等
2)多一次加法,循環(huán)很多次的話,量就很大哦
25#
發(fā)表于 2010-4-27 22:04:17 | 只看該作者
我想不出來
26#
發(fā)表于 2011-1-14 07:59:30 | 只看該作者
速度是問題
27#
發(fā)表于 2013-4-20 13:55:44 | 只看該作者
本帖最后由 伊斯特伍德 于 2013-4-20 14:05 編輯

必須用枚舉法吧。
看了前面幾位同學(xué)的解法,感覺算法上應(yīng)該還可以再優(yōu)化一下,就是:
如果把這N個數(shù)排序,然后從小到大(或者從大到。┫却_定兩個數(shù)字,比如:K1(代表A1),K2(代表A2)(表示最小的兩個),剩下的A3至An,采用二分法查找,如果沒有查到,K1K2再遞增(內(nèi)層是K2,外層是K1,且K2的起點是K1的后續(xù)單元格,且K2<(S-K1)/2),直到K1>=S/3
這樣子算法,在超級大數(shù)據(jù)里的情況下(比如10000數(shù)據(jù)里要查找3個符合條件的記錄),可以省掉很多的枚舉量.



PS:VBA還是不熟悉,就不寫VBA代碼出來讓大家見笑了.
28#
發(fā)表于 2013-4-20 14:11:45 | 只看該作者
判斷是否相等涉及到精度的問題,這個不管用什么算法應(yīng)該都是會遇上的.
只能是改成判斷三個數(shù)相加和S值的接近程度,比如:誤差小于0.000 000 01,這就要求被查的一組數(shù)據(jù)精度有一定的限制
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則

QQ|站長郵箱|小黑屋|手機版|Office中國/Access中國 ( 粵ICP備10043721號-1 )  

GMT+8, 2025-7-13 08:20 , Processed in 0.079315 second(s), 29 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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