设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

123
返回列表 发新帖
楼主: tanhong
打印 上一主题 下一主题

趣味找数字

[复制链接]
21#
发表于 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#
发表于 2009-2-23 20:41:37 | 只看该作者
本帖最后由 ljw990485 于 2009-2-23 21:01 编辑

找3个数就好办,穷举也很快,
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个数和目标数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,只找一组的话就结束
        endif
  多个next
以上程序循环次数
1)给定i,j
k循环 n-(j+1)+1=n-j次
2)故给定i后,j,k循环次数为
[n-(i+1)]+[n-(i+2)]+...+1=(n-i)(n-i-1)/2=(n-i)^2/2-(n-i)/2
3)最大循环次数
[(n-1)^2+...+2^2]/2-[(n-1)+...+2]/2
=n(n-1)(n-2)/6=O(n^3/6)
n=1000时,最大循环数为166167000,不算大,关键是运算非常简单
23#
发表于 2009-2-23 20:43:33 | 只看该作者
如果用0-1规划的方法,也可以,但可能会带来误差的问题
而穷举的方法只有2个加法,舍入误差的影响比较小
24#
发表于 2009-2-23 21:09:52 | 只看该作者
本帖最后由 ljw990485 于 2009-2-25 00:04 编辑

靠,程序一样的

不过有一个地方不一样,大家看出来了吗?

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

1)浮点数不能这样判断是否相等
2)多一次加法,循环很多次的话,量就很大哦
25#
发表于 2010-4-27 22:04:17 | 只看该作者
我想不出来
26#
发表于 2011-1-14 07:59:30 | 只看该作者
速度是问题
27#
发表于 2013-4-20 13:55:44 | 只看该作者
本帖最后由 伊斯特伍德 于 2013-4-20 14:05 编辑

必须用枚举法吧。
看了前面几位同学的解法,感觉算法上应该还可以再优化一下,就是:
如果把这N个数排序,然后从小到大(或者从大到小)先确定两个数字,比如:K1(代表A1),K2(代表A2)(表示最小的两个),剩下的A3至An,采用二分法查找,如果没有查到,K1K2再递增(内层是K2,外层是K1,且K2的起点是K1的后续单元格,且K2<(S-K1)/2),直到K1>=S/3
这样子算法,在超级大数据里的情况下(比如10000数据里要查找3个符合条件的记录),可以省掉很多的枚举量.



PS:VBA还是不熟悉,就不写VBA代码出来让大家见笑了.
28#
发表于 2013-4-20 14:11:45 | 只看该作者
判断是否相等涉及到精度的问题,这个不管用什么算法应该都是会遇上的.
只能是改成判断三个数相加和S值的接近程度,比如:误差小于0.000 000 01,这就要求被查的一组数据精度有一定的限制
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-1 09:11 , Processed in 0.075147 second(s), 30 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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