要干掉的问题是这个样子的... 有一个数组:03 08 13 19 26 28
要求出所有的与之有4个相同的组合数组有5265组(取数范围在1-33之间,直接说就是双色球的33个号码 ^-^):
如
03 08 13 19 27 29
03 08 13 19 28 29
03 08 13 19 29 30
...我编写了以下的程序:
sub fourjz()Dim i As Integer, j As Integer, k As Integer, n As Integer, p As Integer, q As Integer, 1 As Integer,m as integerdim strtb() as stringdim kjh(1) as stringdim arr(1 to 6) as integerarr(1,1)=03
arr(1,2)=08
arr(1,3)=13
arr(1,4)=19
arr(1,5)=26
arr(1,6)=28kjh(1)="03 08 13 19 26 28"
redim strb(1 to 5265)dt = 0For i = 1 To arr(1, 3)For j = 2 To arr(1, 4)For k = arr(1, 1) To arr(1, 5)For n = arr(1, 2) To arr(1, 6)For p = arr(1, 3) To 32For q = arr(1, 4) To 33
If i < j And j < k And k < n And n < p And p < q Then
If InStr(kjh(1), Format(i, "00")) > 0 Then dt = dt + 1
If InStr(kjh(1), Format(j, "00")) > 0 Then dt = dt + 1
If InStr(kjh(1), Format(k, "00")) > 0 Then dt = dt + 1
If InStr(kjh(1), Format(n, "00")) > 0 Then dt = dt + 1
If InStr(kjh(1), Format(p, "00")) > 0 Then dt = dt + 1
If InStr(kjh(1), Format(q, "00")) > 0 Then dt = dt + 1End IfIf dt = 4 Then r1 = r1 + 1 strtb(r1) = Format(i, "00") + " " + Format(j, "00") + " " + Format(k, "00") + " " + Format(n, "00") + " " + Format(p, "00") + " " + Format(q, "00")
End If
dt = 0Next qNext pNext nNext kNext jNext i
end sub以上是1期的循环判断,在我的电脑上大概要10秒,现在数据有705期,全部计算所需时间为:10*705=7050秒,近2个小时,太慢了,敬请各位高手指点一下,谢谢~
(因为我那是共享软件,所以,具体的代码就不便透露了)
给个建议:用c或vc做个计算的dll,或许会提速不少。
If InStr(kjh(1), Format(i, "00")) > 0 Then dt = dt + 1 这句要用两个for i=1 to 6 这样的循环,速度也不会快的你是高手,能否写一个简单的示例,如你也玩双色的话,我们可以交流一下,我还有点心得,呵呵~
先用数组把所有 05 10 15 20 22 32类似这样的都割断成单独的一项
然后
for step6
原来是二维的数组redim arr(1 to 开奖期数,1 to 6)为了说明方便,定义成这样了,理解为第一期开奖号码的第1至第6位谢谢你的参与...
将所有的开奖号码设定为一个长的一维数组,进行了测试,速度没有提高原来是二维的数组 redim arr(1 to 开奖期数,1 to 6) 现在定义为redim arr(1 to 开奖期数*6)循环部分变为:do until 3+r4=开奖期数*6For i = 1 To arrt(3 + r4)For j = 2 To arrt(4 + r4)For k = arrt(1 + r4) To arrt(5 + r4)For n = arrt(2 + r4) To arrt(6 + r4)For p = arrt(3 + r4) To 32For q = arrt(4 + r4) To 33
If i < j And j < k And k < n And n < p And p < q Then
If InStr(kjh(mp), Format(i, "00")) > 0 Then dt = dt + 1
If InStr(kjh(mp), Format(j, "00")) > 0 Then dt = dt + 1
If InStr(kjh(mp), Format(k, "00")) > 0 Then dt = dt + 1
If InStr(kjh(mp), Format(n, "00")) > 0 Then dt = dt + 1
If InStr(kjh(mp), Format(p, "00")) > 0 Then dt = dt + 1
If InStr(kjh(mp), Format(q, "00")) > 0 Then dt = dt + 1End IfIf dt = 4 Then r1 = r1 + 1 strtb(r1) = Format(i, "00") + " " + Format(j, "00") + " " + Format(k, "00") + " " + Format(n, "00") + " " + Format(p, "00") + " " + Format(q, "00")
End If
dt = 0Next qNext pNext nNext kNext jNext ir4 = r4 + 6loop请您烦心看一下,是否我改动的方法不对?
for i=1 to 最后期数 step6 ’总号码的一维数组
n=0
for j=1 to 6 ’每一组号码
for k=1 to 6 '样本号码
'比较
if 相同 then
n=n+1
end if
next
next
if n>=4 then '4个以上号码相同
保存
end if
next
for j=1 to 6 --->for j=i to i+5
for i=1 to 最后期数 step6 ’总号码的一维数组
n=0
for j=1 to 6 ’每一组号码
for k=1 to 6 '样本号码
'比较
if 相同 then
n=n+1
end if
next
next
if n>=4 then '4个以上号码相同
保存
end if
next我晕...for k=1 to 6 '样本号码
'比较
if 相同 then
n=n+1
end if
next 这里的for k=1 to 6 '样本号码 我费了这么大的劲就是为了求出这个"样本号码"呀, 你的程序里没见到怎么求出与"样本号码"...
没有"样本号码"怎么与奖号比较???
1.从6个数取4个有15种 (A1)
2.剩下的27个里取两个有351种组合 (A2)
3.A1,A2的笛卡尔积 15*351应该是不到1秒钟了
example: Dim num1(6) As Integer '6个
Dim num2(27) As Integer '余下27个(33-6)
Dim list1(15) As String '6选4 共15种组合
Dim list2(351) As String '27选2 共351种组合
Dim listall(5265) As String '总共5265种
Dim index As Integer Sub Init() '初始化数组 num1, num2
Dim i As Integer
num1(1) = 3
num1(2) = 8
num1(3) = 13
num1(4) = 19
num1(5) = 26
num1(6) = 28
index = 1
For i = 1 To 33
If i <> num1(1) And i <> num1(2) And i <> num1(3) And i <> num1(4) And i <> num1(5) And i <> num1(6) Then
num2(index) = i
index = index + 1
End If
Next
End Sub Sub EnumNum1() '6选4所有组合
Dim i, j, k, l As Integer
index = 1
For i = 4 To 6
For j = 1 To i - 1
For k = 1 To j - 1
For l = 1 To k - 1
list1(index) = list1(index) + Format(num1(i), "00")
list1(index) = list1(index) + "," + Format(num1(j), "00")
list1(index) = list1(index) + "," + Format(num1(k), "00")
list1(index) = list1(index) + "," + Format(num1(l), "00") + ","
index = index + 1
Next
Next
Next
Next
End Sub Sub EnumNum2() '27选2所有组合
Dim i, j As Integer
index = 1
For i = 2 To 27
For j = 1 To i - 1
list2(index) = Format(num2(i), "00") + "," + Format(num2(j), "00")
index = index + 1
Next
Next
End Sub Sub EnumAll() '列举总共5265组
Init()
EnumNum1()
EnumNum2()
index = 1
Dim i, j As Integer
For i = 1 To 15
For j = 1 To 351
listall(index) = list1(i) + list2(j)
index = index + 1
Next
Next
End Sub
Dim StrOfNum(33) as String
For i = 0 to 33
StrOfNum(i)=Format(i,'00')
Next以后需要用到字符串的地方直接用StrOfNum(x) 代替Format(x,"00")就可以了
这种算法是从理论这个"根"上解决问题,非常理想,在下获益非浅...非常感谢!!!