|
楼主 |
发表于 2014-1-19 16:43
|
显示全部楼层
本帖最后由 aoe1981 于 2014-1-19 17:38 编辑
整理一下,以下代码可概括为:2、3、5、7、11、13+划2、3、5序列!
按这篇百度文库文章的指导思想做了下修改,是否确实起到了优化的效果,由于目前15位数以上的问题没有最终解决,故而难以发现其是否具有运行效率上的优势。代码如下:
Private Sub CommandButton1_Click()
Dim i&, n#, j#, pdjg$, d As Object, ys(), cs(), rng As Range, rng1 As Range, k&, m% '判断结果、因数、次数
If TextBox1.Text = "" Then MsgBox "请输入要判断的自然数!", , "友情提示": Label3.Caption = "": Exit Sub
If IsNumeric(TextBox1.Text) = False Then MsgBox "请输入数字,中间不能有空格!", , "友情提示": TextBox1.Text = "": Label3.Caption = "": Exit Sub
If TextBox1.Text <> Int(TextBox1.Text) Then MsgBox "请输入整数!", , "友情提示": TextBox1.Text = "": Label3.Caption = "": Exit Sub
If TextBox1.Text < 2 Then MsgBox "请输入大于1的自然数!", , "友情提示": TextBox1.Text = "": Label3.Caption = "": Exit Sub
If TextBox1.Text > 999999999999999# Then MsgBox "数据过大,本程序最大可判断的15位数!", , "友情提示": TextBox1.Text = "": Label3.Caption = "": Exit Sub
n = TextBox1.Text
Set d = CreateObject("Scripting.Dictionary")
Do
If n = 2 Then Exit Do
i = 2
Do Until i > n / i
j = n / i
If j = Int(j) Then d(i) = d(i) + 1: GoTo 100
Select Case i
Case Is >= 13
If m Mod 8 = 0 Then m = 0: k = k + 1
Select Case m Mod 8
Case 0
i = 30 * k - 13
Case 1
i = 30 * k - 11
Case 2
i = 30 * k - 7
Case 3
i = 30 * k - 1
Case 4
i = 30 * k + 1
Case 5
i = 30 * k + 7
Case 6
i = 30 * k + 11
Case 7
i = 30 * k + 13
End Select
m = m + 1
Case 2
i = 3
Case 3
i = 5
Case 5
i = 7
Case 7
i = 11
Case 11
i = 13
End Select
Loop
Exit Do
100:
n = j
Loop
If d.Count <> 0 Then d(n) = d(n) + 1
ys() = d.keys
cs() = d.items
For i = 0 To UBound(ys)
If cs(i) > 1 Then pdjg = pdjg & ys(i) & "^" & cs(i) & "*" Else pdjg = pdjg & ys(i) & "*"
Next i
If pdjg = "" Then Label3.Caption = "素数" Else Label3.Caption = "合数 " & Left(pdjg, Len(pdjg) - 1)
'以下代码往工作表中记录判断结果
If [g1] = "" Then Set rng = [g1] Else Set rng = Cells(Rows.Count, "g").End(xlUp).Offset(1, 0)
If Cells(1, 256) = "" Then Set rng1 = Cells(1, 256) Else Set rng1 = Cells(Rows.Count, 256).End(xlUp).Offset(1, 0)
If Columns(256).Find(TextBox1.Text, , , xlWhole) Is Nothing Then
If Label3.Caption <> "素数" Then
rng.Value = TextBox1.Text & "=" & Left(pdjg, Len(pdjg) - 1)
Else
rng.Value = TextBox1.Text & "是素数"
End If
rng1.Value = TextBox1.Text
End If
End Sub
附注:在大数据下(15位以上)进行运算时,首先需特殊处理的为蓝色的两处除法运算,红色处如果大数据在30位以上时,则有可能产生超过15位以上的因数(i)参与判断,这时,将有11处外调程序,相信这样的“优化”反而得不偿失。。。将数据限制在30位及以内还是可行的(其实判断还是进行到输入数据开平方根大小的时候即停止的,30位开平方根的大小差不多是15位),不过也得看实际的运行时间是个什么状况,本次优化,个人感觉“五五开”!不过依据百度文库文章的介绍,只划掉2、3的倍数剩下的数是2、3、6*k±1,这倒只有两种情况,比2、3、5、7、9、11、13、15、17........先偶后奇的序列既简洁又少了不少数据,减少了许多次循环,而且代码也会简单,一会再传。。。
其中循环的处理如下图示:
新的附件如下:
素数判断(参照优化版2).rar
(17.56 KB, 下载次数: 30)
|
|