小弟变了个程序,专门用来算统计量,输入小数则转化为分数,全程用分数计算,结果也用分数表示。程序如下:
Module Module1    Dim m, r, t As Long
    Dim p, q As Long
    Dim fx, fy As Long    Sub yf(ByVal a As Double, ByVal b As Double)
        p = CLng(a)
        q = CLng(b)
        m = p
        r = q
        t = m Mod r
        While t <> 0
            m = r
            r = t
            t = m Mod r
        End While
        p = p / r
        q = q / r
    End Sub    Sub jia(ByVal a As Long, ByVal b As Long, ByVal c As Long, ByVal d As Long)
        fx = a * d + c * b
        fy = b * d
        yf(fx, fy)
    End Sub    Sub jian(ByVal a As Long, ByVal b As Long, ByVal c As Long, ByVal d As Long)
        fx = a * d - c * b
        fy = b * d
        yf(fx, fy)
    End Sub    Sub chu(ByVal a As Long, ByVal b As Long, ByVal c As Long)
        fx = a
        fy = b * c
        yf(fx, fy)
    End Sub    Sub pf(ByVal a As Long, ByVal b As Long)
        fx = a ^ 2
        fy = b ^ 2
        yf(fx, fy)
    End Sub    Sub fs(ByVal a As Double)
        Dim b As Double = 1
        While Int(a) <> a
            a = a * 10
            b = b * 10
        End While
        yf(a, b)
    End Sub    Sub Main()
        Dim i, j As Long
        Dim n As Long
        Dim z As Double
        Dim k() As Double
        Dim x(), y(), sx(), sy() As Long        n = Console.ReadLine()        ReDim k(n + 1)
        ReDim x(n + 1)
        ReDim y(n + 1)
        ReDim sx(n + 1)
        ReDim sy(n + 1)        x(n + 1) = 0
        y(n + 1) = 1
        sx(n + 1) = 0
        sy(n + 1) = 1        For i = 1 To n
            k(i) = Console.ReadLine()
        Next i        For i = 1 To (n - 1)
            For j = (i + 1) To n
                If k(i) > k(j) Then
                    z = k(i)
                    k(i) = k(j)
                    k(j) = z
                End If
            Next j
        Next i        For i = 1 To n
            fs(k(i))
            x(i) = p
            y(i) = q
        Next i        For i = 1 To n
            If y(i) = 1 Then
                Console.Write(x(i).ToString + " ")
            Else
                Console.Write(x(i).ToString + "/" + y(i).ToString + " ")
            End If
        Next i        Console.WriteLine()        For i = 1 To n
            jia(x(i), y(i), x(n + 1), y(n + 1))
            x(n + 1) = p
            y(n + 1) = q
        Next i
        chu(x(n + 1), y(n + 1), n)
        If q = 1 Then
            Console.WriteLine("pj=" + p.ToString)
        Else
            Console.WriteLine("pj=" + p.ToString + "/" + q.ToString)
        End If        Select Case n Mod 2
            Case 0
                jia(x(n / 2), y(n / 2), x(n / 2 + 1), y(n / 2 + 1))
                chu(p, q, 2)
            Case Else
                p = x((n + 1) / 2)
                q = y((n + 1) / 2)
        End Select
        If q = 1 Then
            Console.WriteLine("zw=" + p.ToString)
        Else
            Console.WriteLine("zw=" + p.ToString + "/" + q.ToString)
        End If        For i = 1 To n
            chu(x(n + 1), y(n + 1), n)
            jian(x(i), y(i), p, q)
            pf(p, q)
            sx(i) = p
            sy(i) = q
        Next i
        For i = 1 To n
            jia(sx(i), sy(i), sx(n + 1), sy(n + 1))
            sx(n + 1) = p
            sy(n + 1) = q
        Next i
        chu(sx(n + 1), sy(n + 1), n)
        If q = 1 Then
            Console.WriteLine("fc=" + p.ToString)
        Else
            Console.WriteLine("fc=" + p.ToString + "/" + q.ToString)
        End If        Console.ReadLine()
    End SubEnd Module一般情况下都能得出结果(见图)
http://www.dumpt.com/img/viewer.php?file=xzenm8udpa8rs5gepgbp.jpg
http://www.dumpt.com/img/viewer.php?file=v9dzwoz1hh7ujdb9djjo.jpg
http://www.dumpt.com/img/viewer.php?file=rdzrg38g5lkvu0x1h6gu.jpg但输入某些数字后却会异常(见图)
http://www.dumpt.com/img/viewer.php?file=n6yjm697avrj0clirok5.jpg
大虾们,这是怎么回事?哪里出问题了??求解!

解决方案 »

  1.   

    Long 数据类型
          Long(长整型)变量存储为 32 位(4 个字节)有符号的数值形式,其范围从 -2,147,483,648 到 2,147,483,647。Long 的类型声明字符为和号 (&)。
      

  2.   

    估计出现在下面一段
    Sub fs(ByVal a As Double)
      Dim b As Double = 1
      While Int(a) <> a
      a = a * 10
      b = b * 10
      End While
      yf(a, b)
      End Sub
      

  3.   

    这个判断条件有问题Int(a) <> a
      

  4.   

    你的程序要把长整和双精度数好好规划一下.
    以下过程过程修改后就可以正常运行了.    Sub fs(ByVal a As Double)
            Dim a1, b1 As Long
            b1 = 1
            Dim iA As Byte = Len(Mid(a, InStr(a, ".") + 1))
            If iA <> 0 Then
                a1 = a * 10 ^ iA
                b1 *= 10 ^ iA
            End If        yf(a1, b1)
        End Sub