小弟变了个程序,专门用来算统计量,输入小数则转化为分数,全程用分数计算,结果也用分数表示。程序如下:
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
大虾们,这是怎么回事?哪里出问题了??求解!
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
大虾们,这是怎么回事?哪里出问题了??求解!
Long(长整型)变量存储为 32 位(4 个字节)有符号的数值形式,其范围从 -2,147,483,648 到 2,147,483,647。Long 的类型声明字符为和号 (&)。
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 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