2010-11-20 3 views
0

이 코드는 모든 숫자에 대해 1의 결과를 제공하며 이유를 알지 못합니다. 당신은 GCD에 NUM1과 num2를 전달하지만, 그들과 함께 아무것도하지 않을 1.공통 분모를 계산하는 중 오류가 발생했습니다.

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 전문가가 아니지만 'gcd'는 무엇을 반환합니까? – thejh

+0

gcd 함수는 매개 변수에 액세스하지 않습니다. gcd의 do 루프는 b가 항상 0이기 때문에 즉시 종료됩니다. gcd를 호출하는 for 루프는 gcd가 항상 0을 반환하기 때문에 phi를 수정하지 않습니다. – snarf

답변

1

이 코드의 모든 N에 대한 피 (n)은 나에게 제공합니다. 대신에 a와 b를 사용하고 있는데, 기본값은 0이 될 것이기 때문에 gcd 함수는 실제로 아무것도하지 않습니다. 그리고 그랬더라도 결과에 따라 아무 것도 반환하지 말라고하셨습니다.

1

귀하의 gcd 기능은 num1num2 소요 및 초기화 등 제로되어 있지 않은 ab으로 대신 작업을 무시합니다.

1

여기서 gcd 함수에서 변수 a 및 b의 값을 설정합니까? 나 또한 아무것도 반환 귀하의 GC 기능을 볼 수 없습니다.

1

Return 문이 누락되었습니다.

0

두 개의 텍스트 상자를 사용하여 숫자를 나타냅니다. 라벨에는 GCD가 포함됩니다. 유클리드 알고리즘을 구현 한 것입니다.

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 
관련 문제