任何人都可以向我详细解释vb中的这一行是做什么的吗?

时间:2014-05-11 21:58:12

标签: vb.net math visual-studio-2012 numbers

我有下面的代码片段来判断我的vb项目中的数字是否为素数。

Public Sub CheckButton_Click(sender As Object, e As EventArgs) Handles CheckButton.Click

        Dim myNumber As Integer, myDivider As Integer
        myNumber = Integer.Parse(PrimeTextBox.Text)

        Select Case myNumber
            Case Is <= 0
                MessageBox.Show("I'm only accepting values above 0. :p")
                Exit Sub
        End Select

        For myDivider = 2 To (myNumber - 1)
            If myNumber Mod myDivider = 0 Then
                MessageBox.Show(" " & myNumber & " is not a prime Number")
                Exit For
            End If
        Next

        If (myDivider > (myNumber / myDivider)) Then
            MessageBox.Show(" " & myNumber & " is a prime number")
        End If
End Sub

我理解所有这些直到:

If (myDivider > (myNumber / myDivider)) Then

        MessageBox.Show(" " & myNumber & " is a prime number")

    End If

我无法理解上面的行是什么,我所知道的是当我从代码中删除这些行时,9,21,99等数字都被检测为素数,这是不正确的。

据我所知,第一个For循环检查用户输入的数字是否可以被2到数字的任何数字整除 - 1显然,素数只能被自身除以1

我希望有人能够清楚地向我解释这些行在我的代码中的确切含义,因为现在我只知道它有助于检查9,99等数字是否为素数。感谢。

2 个答案:

答案 0 :(得分:1)

我们可以在这种情况下重写数学,以获得它的作用的不同视图:

If (myDivider > (myNumber / myDivider)) Then

与:

相同
If (myDivider * myDivider > myNumber) Then

与:

相同
If (myDivider > Math.Sqrt(myNumber)) Then

因此,条件检查分隔符是否大于数字的平方根。

该代码之前的循环不使用该事实,但您只需要检查一个偶数分频器,直到该数字的平方根。如果分频器大于那个,则意味着循环完成而没有找到偶数分频器,并且数字是素数。

在查看其余代码时更有意义的条件是检查变量在循环之后的值:

If (myDivider = myNumber) Then

另一种选择是在循环中使用End Sub而不是End For,然后根本不需要循环后的条件。

答案 1 :(得分:1)

好吧..第二个循环似乎是对质数检查算法的错误优化。你可以写一下:

Public Sub CheckButton_Click(sender As Object, e As EventArgs) Handles CheckButton.Click

    Dim myNumber As Integer, myDivider As Integer
    myNumber = Integer.Parse(PrimeTextBox.Text)

    Select Case myNumber
        Case Is <= 0
            MessageBox.Show("I'm only accepting values above 0. :p")
            Exit Sub
    End Select

    Dim myDividerLimit As Integer
    myDividerLimit = CInt(Math.Floor(Math.Sqrt(myNumber)))

    For myDivider = 2 To myDividerLimit
        If myNumber Mod myDivider = 0 Then
            MessageBox.Show(" " & myNumber & " is not a prime Number")
            Exit Sub
        End If
    Next

    MessageBox.Show(" " & myNumber & " is a prime number")
End Sub