回 帖 发 新 帖 刷新版面

主题:我是没招了,看你的了

用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个回复)

沙发

1. 每行6个数为一组? 一组为一个单位进行对比?
2. 某组所在文件的顺序不需要考虑?

3. 我注意到这些数据,六个数从小到大,而且数都不大,为什么没有特别号码?

板凳


补充一下:
1,比较是aaa.txt一组6个数字和qqq.txt的一组6个数字进行比较,完全相同就goto 98,其余的输出。
2,我觉得我程序的思路很直接,但算法肯定不是好的,所以会出现运行时间太长的问题,这是我需要各位帮助的地方。
3,没有特别号码,不需考虑。

3 楼

六和彩不是也有特码的吗?

4 楼

其实代码我已经写好,
在EXCEL里运行,
估计要一个小时左右。

方法也就三个字:先排序

但我非常好奇,你的题目到底是什么用途的。
如果我在程序里加点错误什么的,你能看得出来吗?

5 楼


谢谢moz,感谢你的回复
如能在excel里运行,并且能在1小时左右完成,正是我需要的东西,拜托贴上来好不,跪求等待中...
回答你的问题:1、题目的目的是研究双色球,希望能发现些有规律性的东西,现在还没什么结果,有了的话我想与你共同分享或探讨。2、我是新手,你如在程序中加些错误我很可能是看不出来的,但我相信你这样的专家级的人物是不会故意那样为之的。

6 楼

其实我想说:
1.我不是高手。不是专家。
2.其实我也买双色球,每月一两百左右。
3.但我反对把心思放在这些乱七八糟的事情上面。
花钱可以,花精神花时间那是浪费生命。

7 楼

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 楼

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 楼


文件不知怎么放到上面,告诉我QQ,我传给你。

10 楼


moz,你好
5555.txt发到邮箱了,moz@21cn.net,谢谢

我来回复

您尚未登录,请登录后再回复。点此登录或注册