|
本帖最后由 下标越界 于 2015-2-23 22:42 编辑
按群子老师的test9对1千2百万范围内的整数筛选出788060个素数。
想象中按照分块显示输出到excel表格中,分块规则如下:
每100个素数为一块,每块中按10X10排列;每25个“块”横向排成“一排”,每超过25个块就换“下一排”。于是很自然地有了如下代码:- Sub test9()
- Dim t1, t2, r11, c11, tab1
-
- 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
- Cells(1, 2) = "test9范围" & n & "耗时" & tim2 - tim1 & "秒"
- ReDim Preserve b&(1 To k)
- '[a9] = k: If k < 65536 Then [b:b] = "": [b1].Resize(k) = Application.Transpose(b)
-
- t1 = Timer
-
- ' r1 = Int((k - 1) / 100) + 1
- r11 = Int((k - 1) / 2500) + 1
-
-
-
- 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 * (1 + (-1) ^ j) / 2, 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)
-
- Next o, j, i
-
- t2 = Timer
- Cells(1, 3) = "输出耗时" & t2 - t1 & "秒"
- Cells(1, 4) = k & "个素数"
-
- End Sub
复制代码 结果如下:
输出时间太长了,有办法缩短吗?
另外,为了直观上区分各个数据块,采取了给每个块添加不同底色(且相邻块色差很明显)的方式,但如下图所示,显然失败了,相邻区域经常出现相同底色,产生“连成一片”的效果了,第二问来了:如何设置,使得每块底色不同于四周且对比色差明显。楼下有人继续接吧。
缩放到最小后的整体
|
-
截图
|