2010-11-20 28 views
0

Bu kod tüm numaralar için 1 sonuç verir ve ben nedenini bilmiyorum. Sen gcd için num1 ve NUM2 geçen değil onlarla bir şey yapmıyoruz 1.hatası hesaplama ortak paydalar

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 

    Dim n As Integer 
    n = CStr(TextBox1.Text) 

    Dim phi As Integer 
    Dim i As Integer 

    phi = 1 
    For i = 1 To n 
     If (gcd(i, n) = 1) Then 
      phi = phi + 1 
      End If 

    Next 

    Label3.Text = phi 
End Sub 
Private Function gcd(ByVal num1 As Integer, ByVal num2 As Integer) As Integer 

    Dim a As Integer 
    Dim b As Integer 
    Dim reminder As Integer 
    Dim temp As Long 

    If (b > a) Then 

     temp = a 
     a = b 
     b = temp 

    End If 

    Do While (b <> 0) 

     reminder = a Mod b 
     a = b 
     b = reminder 

    Loop 

End Function 
+0

VB uzmanı değilim, ama 'gcd 'bir şey döndürüyor mu? – thejh

+0

gcd işlevi hiçbir zaman parametrelerine erişmiyor. Gcd'de do döngüsü hemen biter çünkü b her zaman 0'a eşittir. Gcd'yi çağıran döngü, hiçbir zaman phi'yi değiştirmeyecektir, çünkü gcd her zaman 0 değerini döndürür. – snarf

cevap

1

Bu kodun herhangi n için phi (n) me ver. Bunun yerine orada a ve b kullanıyorsunuz ... ki bu varsayılan olarak sıfır olacak ... bu nedenle gcd işlevi aslında hiçbir şey yapmıyor. Ve olsa bile, sonuçlarına dayanarak bir şey döndürmesini söylemediniz.

1

Sizin gcd fonksiyon num1 ve num2 alır ve başlatıldı ve böylece sıfır edilmeyen a ve b ile yerine çalışma, onları yok sayar.

1

gcd işlevindeki a ve b değişkenlerinin değerini nerede belirlersiniz? Ayrıca gcd işlevinin hiçbir şey döndürmediğini görmüyorum.

1

Return ifadesini göremiyorsunuz. İki metin kutularının

0

Kullanım sayıları temsil etmek. Etiket GCD içerecektir. Bu, Euclid'in algoritmasının bir uygulamasıdır.

Dim dividend As Long 
Dim divisor As Long 
Dim quotient As Long 
Dim remainder As Long 

    If Long.TryParse(TextBox1.Text, dividend) Then 

     If Long.TryParse(TextBox2.Text, divisor) Then 
'place in correct order 
      quotient = Math.Max(dividend, divisor) 'determine max number 
      remainder = Math.Min(dividend, divisor) 'determine min number 
      dividend = quotient 'max is dividend 
      divisor = remainder 'min is divisor 
      Do 
       quotient = Math.DivRem(dividend, divisor, remainder) 'do the division 
'set up for next divide 
       dividend = divisor 'dividend is previous divisor. if remainder is zero then dividend = GCD 
       divisor = remainder 'divisor is previous remainder 
      Loop While remainder <> 0 'loop until the remainder is zero 
      Label1.Text = dividend.ToString("n0") 
     End If 
    End If