2014-05-11 34 views
0

我有下面的代碼片斷,以告訴如果一個數字是素數或不在我的vb項目。任何人都可以向我詳細解釋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

9,21,99如何被第一個循環檢測爲素數?當myDivider = 3時,Mod將返回0,這將顯示「Not a prime number」消息。 – metacubed

+0

我明白你想說什麼,但我認爲數字只能被2除,所以當像9,21和99這樣的數字被輸入時,如果我決定添加一個'否則'語句,即當數字返回1的模數時,其上的Option Strict可能會反對'myDivider'的第二次使用; –

+0

;它是一個循環索引器 – Plutonix

回答

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在循環中,則根本不需要循環之後的條件。

+0

非常感謝你Guffa,你的回答真的幫助我理解。 –

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 
相關問題