2014-06-08 145 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