天天看點

求N以内的所有素數的個數

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。

繼續閱讀