2010-11-20 13 views
0

このコードでは、すべての数値に対して1の結果が得られますが、理由はわかりません。 PHI(n)は、このコードで任意のnのは、あなたが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

を与えます。代わりにaとbを使用しています...デフォルトでは0になるので、gcd関数は実際に何もしません。たとえそれがあったとしても、その結果に基づいて何かを返すように言わなかったのです。

1

あなたgcd機能はnum1num2を取り、aと初期化され、そのゼロではありませんされてbで代わりに作業し、それらを無視します。

1

ここで、gcd関数で変数aとbの値を設定しますか?私はあなたのgcd関数が何かを返すことも見ません。

1

Returnステートメントがありません。

0

2つのテキストボックスを使用して数値を表します。ラベルには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 
関連する問題