Private Sub llStart_LinkClicked( ByVal sender As System.Object, ByVal e As _
System.Windows.Forms.LinkLabelLinkClickedEventArgs) _
Handles llStart.LinkClicked
If IsNumeric(Me.txtMaxNbr.Text) = False Then
MsgBox("Max Nbr must be numeric!", _
MsgBoxStyle.Exclamation, _
"Max Nbr Not Numeric")
Return
End If
Dim N, i, j
N = CInt(Me.txtMaxNbr.Text)
Dim z(N)
Dim startTime As DateTime = Now
'initialize array
For i = 0 To N
z(i) = 0
Next
'mark multiples of i
For i = 2 To N / 2
For j = 2 * i To N Step i
z(j) = 1
Next
Next
'count unmarked numbers, which are primes
Dim nbr = 0
For i = 2 To N
If z(i) = 0 Then
nbr += 1
End If
Next
Dim ts As New TimeSpan(Now.Ticks - startTime.Ticks)
Me.lblNbrPrimes.Text = nbr
Me.lblTime.Text = ts.ToString
End Sub
回複:這段可笑的代碼更堅定了我在VB.NET上的信心了
For i = 2 To N / 2
For j = 2 * i To N Step i
z(j) = 1
Next
Next
這個算法的意思是:周遊2到n/2的數i,對于每個i,在數組z中設定其所有的倍數為1。這個z其實可以用bool型表示,1為合數,0為質數。
For i = 2 To N
If z(i) = 0 Then
nbr += 1
End If
Next
周遊z,nbr記下一共有多少個質數。
原版算法請看:http://www.math.utah.edu/classes/216/assignment-07.html
這個算法确實很優,它的算法z(j)=1執行步數為x,x是小于N的所有合數的數目,很明顯x<=N。