|
本帖最后由 下标越界 于 2015-2-24 22:16 编辑
用群子的代码测试输出1千2百万范围内的素数,发现速度很快,仅几秒钟,而本人在80楼测试的输出时间达到近80秒。两相比较一下就看出:群子使用了二维数组整体输出到excel表格中,大大提升了输出速度,节约了大量时间。于是我把80楼的代码稍稍改动了一下:- Sub test9()
- Dim t1, t2, r11, c11, tab1, arr()
-
- Dim i&, j&, k&, m&, n&, tim1, tim2
- n = [a1]
-
- tim1 = Timer
- m = (n - 1) \ 2: ReDim a(1 To m) As Boolean
- For i = 1 To Sqr(n) \ 2
- If a(i) = False Then
- For j = i * 3 + 1 To m Step i * 2 + 1
- a(j) = True
- Next
- End If
- Next
-
- nSize = Array(1, 1, 0.5, 0.17, 0.125, 0.1, 0.08, 0.067, 0.058, 0.055)
- k = n * nSize(Log(n) / Log(10))
- ReDim b&(1 To k): b(1) = 1: b(2) = 2: k = 2
- For i = 1 To m
- If a(i) = False Then k = k + 1: b(k) = i * 2 + 1
- Next
-
- tim2 = Timer
-
- ReDim Preserve b&(1 To k)
- '[a9] = k: If k < 65536 Then [b:b] = "": [b1].Resize(k) = Application.Transpose(b)
- Cells.Clear
- t1 = Timer
-
- ' r1 = Int((k - 1) / 100) + 1
- r11 = Int((k - 1) / 2500) + 1
-
- ReDim arr(1 To r11 * 10, 1 To 250)
-
- On Error Resume Next
- For i = 1 To r11
- For j = 1 To 25
- Set tab1 = Cells(1 + (i - 1) * 10 + 1, 1 + (j - 1) * 10 + 1)
- Range(tab1, tab1.Offset(9, 9)).Interior.Color = RGB(255 * Round(Rnd), 255 * Round(Rnd), 255 * Round(Rnd)) '(1 + (-1) ^ (j + 1)) / 2)
- For o = 1 To 100
- ' Cells(Int((o - 1) / 10) + 1 + (i - 1) * 10 + 1, (o - 1) Mod 10 + 1 + (j - 1) * 10 + 1) = b((i - 1) * 2500 + (j - 1) * 100 + o)
- arr(Int((o - 1) / 10) + 1 + (i - 1) * 10, (o - 1) Mod 10 + 1 + (j - 1) * 10) = b((i - 1) * 2500 + (j - 1) * 100 + o)
- Next o, j, i
-
-
- [b2].Resize(r11 * 10, 250) = arr '输出
- ' MsgBox arr(2, 2)
- t2 = Timer
-
- Cells(1, 2) = "test9范围" & n & "耗时" & tim2 - tim1 & "秒"
- Cells(1, 3) = "输出耗时" & t2 - t1 & "秒"
- Cells(1, 4) = k & "个素数"
-
- End Sub
复制代码 运行结果如图:
输出耗时缩短
综合以上,算不算是一个”空间换时间“的例子呢?
C:\Users\wen\Pictures\输出耗时缩短 |
|