我有下面的代码片段来判断我的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等数字是否为素数。感谢。
答案 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