主题:我是没招了,看你的了
酷酷大灰狼
[专家分:0] 发布于 2010-03-31 01:21:00
用Quick Basic 7.1编了下面的程序,来比较aaa.txt和qqq.txt这两个文件。
aaa.txt的格式如下,共965597组:
05,09,14,21,24,27
07,16,19,21,24,25
13,21,23,30,31,32
01,06,09,15,25,33
04,05,14,18,21,32
......
qqq.txt的格式如下,共1450000组:
05,15,16,22,23,29
02,12,15,17,18,25
02,03,04,05,09,20
13,15,19,21,28,29
10,12,19,20,24,25
......
比较的目的是将aaa.txt中不包含qqq.txt的数据显示出来,并输出为999.txt文件。
Open "e:\999.txt" For Output As #3
Open "e:\aaa.txt" For Input As #1
For m = 1 To 965597
Input #1, i1, i2, i3, i4, i5, i6
Open "e:\qqq.txt" For Input As #2
For n = 1 To 1450000
Input #2, a, b, c, d, e, f
If i1 = a And i2 = b And i3 = c And i4 = d And i5 = e And i6 = f Then GoTo 98
If n = 1450000 Then GoTo 96
GoTo 97
96 Print #3, i1; ","; i2; ","; i3; ","; i4; ","; i5; ","; i6
97 Next n
98 Close #2
Next m
Close #1
Close #3
End
程序运行没有问题,可以实现希望达到的目的。但程序运行时间太长,完全运行完
估计需要750小时。我的计算机是P4、CPU3.0GHz,有点老。我对程序不太懂,只略
懂一点Basic,是新手。
各位大虾有没有什么招,既能实现希望达到的目的,又能使程序运行能在1到2小时之
内完成。要是大虾觉得这个程序不能用、太土,能不能为不才重新编一个,最好是
Basic的,别的我不懂。谢谢!
回复列表 (共15个回复)
沙发
moz [专家分:37620] 发布于 2010-03-31 07:30:00
1. 每行6个数为一组? 一组为一个单位进行对比?
2. 某组所在文件的顺序不需要考虑?
3. 我注意到这些数据,六个数从小到大,而且数都不大,为什么没有特别号码?
板凳
酷酷大灰狼 [专家分:0] 发布于 2010-03-31 22:31:00
补充一下:
1,比较是aaa.txt一组6个数字和qqq.txt的一组6个数字进行比较,完全相同就goto 98,其余的输出。
2,我觉得我程序的思路很直接,但算法肯定不是好的,所以会出现运行时间太长的问题,这是我需要各位帮助的地方。
3,没有特别号码,不需考虑。
3 楼
moz [专家分:37620] 发布于 2010-03-31 23:49:00
六和彩不是也有特码的吗?
4 楼
moz [专家分:37620] 发布于 2010-04-01 07:26:00
其实代码我已经写好,
在EXCEL里运行,
估计要一个小时左右。
方法也就三个字:先排序
但我非常好奇,你的题目到底是什么用途的。
如果我在程序里加点错误什么的,你能看得出来吗?
5 楼
酷酷大灰狼 [专家分:0] 发布于 2010-04-02 01:37:00
谢谢moz,感谢你的回复
如能在excel里运行,并且能在1小时左右完成,正是我需要的东西,拜托贴上来好不,跪求等待中...
回答你的问题:1、题目的目的是研究双色球,希望能发现些有规律性的东西,现在还没什么结果,有了的话我想与你共同分享或探讨。2、我是新手,你如在程序中加些错误我很可能是看不出来的,但我相信你这样的专家级的人物是不会故意那样为之的。
6 楼
moz [专家分:37620] 发布于 2010-04-02 16:24:00
其实我想说:
1.我不是高手。不是专家。
2.其实我也买双色球,每月一两百左右。
3.但我反对把心思放在这些乱七八糟的事情上面。
花钱可以,花精神花时间那是浪费生命。
7 楼
moz [专家分:37620] 发布于 2010-04-02 20:38:00
Dim s&(1600000) '文件的最大行数
Dim n&, fl&
Sub justdoit()
timer1 = Timer
Sortfile "aaa.txt"
Sortfile "qqq.txt"
Open "~aaa.txt" For Input As #1
Open "~qqq.txt" For Input As #2
Open "999.txt" For Output As #3
Line Input #1, a1$
Line Input #2, b1$
Do Until EOF(1) Or EOF(2)
If a1$ = b1$ Then Line Input #1, a1$
Do While a1$ > b1$
Line Input #2, b1$
Loop
Do While a1$ < b1$
Line Input #1, a1$
Print #3, a1$
Loop
Loop
Close
MsgBox Timer - timer1
End Sub
Sub Sortfile(f1$)
maxs& = 1600000
r& = 0 '如果值为1,则倒序
n& = 1 '按第 n 列字母顺序排列文件顺序.
'f1$ = "aaa.txt"
f2$ = "~" + f1$
Open f1$ For Binary As #1
s&(1) = 1
m& = 1
fl& = 1
c& = LOF(1)
crlf$ = Chr$(13) + Chr$(10) '回车换行符
b$ = " "
Do Until EOF(1)
b$ = Right$(b$, 1) + Input$(16380, 1)
Do
i& = InStr(i& + 1, b$, crlf$)
If i& > 0 Then
k& = i& + j& + 1
If k& < c& Then
m& = m& + 1
s&(m&) = k&
If s&(m&) - s&(m& - 1) > fl& Then fl& = s&(m&) - s&(m& - 1)
End If
End If
Loop While i&
j& = j& + 16380
Loop
l& = l& - n&
QuickSort 1, m&
Close #1
If r& > 0 Then
i1& = m&
i2& = 1
i3& = -1
Else
i1& = 1
i2& = m&
i3& = 1
End If
Open f1$ For Input As #1
Open f2$ For Output As #2
For i& = i1& To i2& Step i3&
Seek #1, s&(i&)
Line Input #1, w$
Print #2, w$
k& = k& + 1
Next
Close #1, #2
End Sub
Function fs$(d&)
Seek #1, d& + n& - 1
fs$ = Input$(fl&, 1)
End Function
Sub QuickSort(l&, h&)
DoEvents
If l& < h& Then
If h& - l& = 1 Then
If fs$(s&(l&)) > fs$(s&(h&)) Then
k& = s&(l&)
s&(l&) = s&(h&)
s&(h&) = k&
End If
Else
r& = Int(Rnd * (h& - l& + 1)) + l&
k& = s&(r&)
s&(r&) = s&(h&)
s&(h&) = k&
p$ = fs$(s&(h&))
i& = l&
j& = h&
Do
Do While (i& < j&) And (fs$(s&(i&)) <= p$)
i& = i& + 1
Loop
Do While (j& > i&) And (fs$(s&(j&)) >= p$)
j& = j& - 1
Loop
If i& < j& Then
k& = s&(i&)
s&(i&) = s&(j&)
s&(j&) = k&
End If
Loop While i& < j&
k& = s&(i&)
s&(i&) = s&(h&)
s&(h&) = k&
If (i& - l&) < (h& - i&) Then
QuickSort l&, i& - 1
QuickSort i& + 1, h&
Else
QuickSort i& + 1, h&
QuickSort l&, i& - 1
End If
End If
End If
End Sub
8 楼
酷酷大灰狼 [专家分:0] 发布于 2010-04-03 04:38:00
Moz,我非常感谢你,感谢你编写的程序,有机会你来西安的话我请你吃饭。QQ:641614778
先说你的程序,我首先将5~9行改成以下,即aaa.txt、qqq.txt和999.txt所在的目录:
Sortfile "e:\ssq\aaa.txt"
Sortfile "e:\ssq\qqq.txt"
Open "e:\ssq\aaa.txt" For Input As #1
Open "e:\ssq\qqq.txt" For Input As #2
Open "e:\ssq\999.txt" For Output As #3
然后运行,鼠标指针变成沙漏状,不到10分钟,鼠标指针变成“Ⅰ”,似乎运行结束了,但并没有产生999.txt,原来的aaa.txt、qqq.txt也没有什么变化,我不知道我那样改程序对不,也不知道为什么会这样。说实话,我只是在多年前上学时学了20多个课时的basic,现在基本上也忘了,我问了一下百度,得知在EXCEL中运行的是VBA,这我就不懂了。
再说说题目的用意,aaa.txt是我用下面的程序生成的
Open "e:\ssq\aaa.txt" For Output As #1
l = 1
For i1 = 1 To 28
For i2 = i1 + 1 To 29
For i3 = i2 + 1 To 30
For i4 = i3 + 1 To 31
For i5 = i4 + 1 To 32
For i6 = i5 + 1 To 33
If i6 = i5 + 1 And i5 = i4 + 1 Then GoTo 998
If i5 = i4 + 1 And i4 = i3 + 1 Then GoTo 998
If i4 = i3 + 1 And i3 = i2 + 1 Then GoTo 998
If i3 = i2 + 1 And i2 = i1 + 1 Then GoTo 998
If i6 Mod 2 = 0 And i5 Mod 2 = 0 And i4 Mod 2 = 0 And i3 Mod 2 = 0 And i2 Mod 2 = 0 And i1 Mod 2 = 0 Then GoTo 998
If i6 Mod 2 = 1 And i5 Mod 2 = 1 And i4 Mod 2 = 1 And i3 Mod 2 = 1 And i2 Mod 2 = 1 And i1 Mod 2 = 1 Then GoTo 998
If i1 > 19 Then GoTo 998
If i6 < 17 Then GoTo 998
If i6 + i5 + i4 + i3 + i2 + i1 < 50 Then GoTo 998
If i6 + i5 + i4 + i3 + i2 + i1 > 160 Then GoTo 998
Print #1, i1; ","; i2; ","; i3; ","; i4; ","; i5; ","; i6
GoTo 999
998 l = l - 1
999 l = l + 1
Next i6
Next i5
Next i4
Next i3
Next i2
Next i1
Close #1
End
实际上就是列出不包括3连号、全偶数和全奇数以及和值在50~160之间的全部组合。
5555.txt(已用EXCEL排过序)是我从2003年来买的双色球的红球,有5万多个,但从未中过大奖,qqq.txt是我用下面的程序生成的
Open "e:\ssq\qqq.txt" For Output As #1
Open "e:\ssq\5555.txt" For Input As #6
For n = 1 To 52120
Input #6, a, b, c, d, e, f
Print #1, a; ","; b; ","; c; ","; d; ","; e; ","; f
p1 = a - 1
p2 = b - a
p3 = c - b
p4 = d - c
p5 = e - d
p6 = f - e
p7 = 33 - f
If p1 > 0 Then GoTo 10
GoTo 20
10 For q1 = 1 To p1
Print #1, q1; ","; b; ","; c; ","; d; ","; e; ","; f
Next q1
20 If p2 > 1 Then GoTo 30
GoTo 40
30 For q2 = a + 1 To a + p2 - 1
Print #1, q2; ","; b; ","; c; ","; d; ","; e; ","; f
Next q2
40 If p3 > 1 Then GoTo 50
GoTo 60
50 For q3 = b + 1 To b + p3 - 1
Print #1, a; ","; q3; ","; c; ","; d; ","; e; ","; f
Next q3
60 If p4 > 1 Then GoTo 70
GoTo 80
70 For q4 = c + 1 To c + p4 - 1
Print #1, a; ","; b; ","; q4; ","; d; ","; e; ","; f
Next q4
80 If p5 > 1 Then GoTo 90
GoTo 100
90 For q5 = d + 1 To d + p5 - 1
Print #1, a; ","; b; ","; c; ","; q5; ","; e; ","; f
Next q5
100 If p6 > 1 Then GoTo 110
GoTo 120
110 For q6 = e + 1 To e + p6 - 1
Print #1, a; ","; b; ","; c; ","; d; ","; q6; ","; f
Next q6
120 If p7 > 1 Then GoTo 130
GoTo 140
130 For q7 = f + 1 To f + p7
Print #1, a; ","; b; ","; c; ","; d; ","; e; ","; q7
Next q7
140 Next n
Close #6
Close #1
End
我发觉,即使把我那5万多个红球组合中的任何一个号码改变,这样就会有52000×28=1456000个红球组合(这里会有些是重复的),也只有几个能与1000多期中的大奖一致(运气真是很差!),所以我想在aaa.txt中去掉qqq.txt中所有的组合,初步估计能将aaa.txt中包含的组合从90多万个减少到15万个左右,这就是我这个题目的目的,不知我说清了没。
我很赞成你“但我反对把心思放在这些乱七八糟的事情上面。花钱可以,花精神花时间那是浪费生命。”的意见,我其实只是6、7年来每期机选50~100注,从来不去琢磨什么走势等,只是最近有些时间,想了上面这些东西,想看看这15万个左右在以后这些期中中奖的情况而已。
我把5555.txt和我用的QB7.1贴在这里,你可以检验一下你的程序。
最后还是要再次谢谢你,感谢你的回复。
9 楼
酷酷大灰狼 [专家分:0] 发布于 2010-04-03 04:40:00
文件不知怎么放到上面,告诉我QQ,我传给你。
10 楼
酷酷大灰狼 [专家分:0] 发布于 2010-04-05 01:04:00
moz,你好
5555.txt发到邮箱了,moz@21cn.net,谢谢
我来回复