2014-06-08 143 views
0

我的代碼:降低分數

Private Sub btnReduce_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnReduce.Click 

    Call Reduce() 

End Sub 

Function Reduce() As Single 

    Dim num As Integer = txtNum.Text 
    Dim deno As Integer = txtDeno.Text 

    For i = 1 To deno Step +1 
     If num Mod i = 0 Then 
      num = num/i 
     End If 

     If deno Mod i = 0 Then 
      deno = deno/i 
     End If 

    Next 

    lblOutputNum.Text = num 
    lblOutputDeno.Text = deno 

End Function 

當我進入2/4它給了我1/2。但是當我輸入3/6時,它會給我1/1。有誰知道它爲什麼這樣做?因爲我無法弄清楚這一點。感謝任何可以的人。

+0

請考慮在以前的版本[降低分數(http://stackoverflow.com/questions/24093302/visual-basic-reducing-fractions)問題給你閱讀的鏈接。我沒有看到鏈接[簡化分形](http://stackoverflow.com/questions/5287514/how-to)中建議的計算[GCD](http://en.wikipedia.org/wiki/Greatest_common_divisor)的代碼 - 簡化的級分)。 –

+0

是的,但那是C#? – user3695840

+0

GCD確實不是語言特定的.... [GCD](http://simple.wikipedia.org/wiki/Gcd) - 和相應的[歐幾里得算法](http://en.wikipedia.org/wiki/Euclidean_algorithm )。 –

回答

2

不能彼此獨立分開的分子和分母,或者你會改變分數值:

For i = 1 To Math.Min(deno, num)/2 Step +1 
    If num Mod i = 0 And deno Mod i = 0 Then 
     num = num/i 
     deno = deno/i 
    End If 
Next 

請記住,這種做法是不是很高性能。你需要用它們的最大公約數除分子和分母。 GCD可以用歐幾里得算法來計算。

+2

+1。 OP似乎沒有興趣使用GCD,因爲它昨天已經提出。 –

0

使用Nico的例子,我設法進一步降低了分數。

For i = 1 To Math.Min(deno, num)/2 Step +1 
If num Mod i = 0 And deno Mod i = 0 Then 
    num = num/i 
    deno = deno/i 
End If 
If i > 1 Then 
    While nume Mod i = 0 And deno Mod i = 0 
    nume = nume/i 
    deno = deno/i 
    End While 
End If 
Next