回 帖 发 新 帖 刷新版面

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

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

11 楼

自己慢慢研究吧,我没什么兴趣。

12 楼

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

13 楼


哇塞[em9]

14 楼

我以为用do循环会省些时间,因为do循环满足条件会退出,for则按数量循环到底。

15 楼

[quote]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[/quote]

我来回复

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