|

楼主 |
发表于 2021-5-6 13:56
|
显示全部楼层
本帖最后由 ysr 于 2021-5-7 23:37 编辑
'如下除法程序可以使用,经过多次运算了:
Public Function MCC1(D1 As String, D2 As String) As String ';大整数的除法
Dim ss
ss = MBJC(D1, D2)
If ss = -1 Then
MCC1 = "0" & "/" & D1
Else
If ss = 0 Then
MCC1 = 1
Else
If Len(D1) = Len(D2) Then
Do While MBJC(D1, D2) >= 0
S1 = S1 + 1
D1 = MPC(D1, D2)
Loop
If D1 = 0 Then
MCC1 = S1
Else
MCC1 = S1 & "/" & D1
End If
Else
If Len(D2) < 9 Then
MCC1 = MCC(D1, D2)
Else
Dim X, Y ';定义分段长度
X = Len(D1): Y = Len(D2)
Dim JW, jcc, jss, jcs
Dim A() As String, B() As String
ReDim A(1 To X)
ReDim B(1 To Y)
For I = 1 To X
A(I) = Mid(D1, I, 1)
Next
For J = 1 To Y
B(J) = Mid(D2, J, 1)
Next
jcc = Val(A(1) & A(2)) \ Val(B(1) & B(2))
jss = MbC(Trim(jcc), D2)
For i1 = 1 To Y
jws = jws & A(i1)
Next
Do While MBJC(Trim(jws), Trim(jss)) = -1
jcc = jcc - 1
jss = MbC(Trim(jcc), D2)
Loop
JW = MPC(Trim(jws), Trim(jss))
z = X - Y
Dim c() As String
ReDim c(1 To z)
For s = 1 To z
If MBJC(JW & A(s + Y), D2) = -1 Then
c(s) = "0"
Else
jwc = Val(Left(JW & A(s + Y), 3)) \ Val(Left(D2, 2))
If Len(jwc) > 1 Then
c(s) = "9"
Else
c(s) = jwc
End If
Do While MBJC(JW & A(s + Y), MbC(Val(c(s)), D2)) = -1
c(s) = Right(10000 + Val(c(s) - 1), 1)
Loop
End If
JW = MPC(JW & A(s + Y), MbC(Val(c(s)), D2))
jcc = jcc & c(s)
Next s
If JW = 0 Then
MCC1 = jcc
Else
MCC1 = jcc & "/" & JW
End If
For I = 1 To Len(MCC1)
If Not Mid(MCC1, I, 1) = "0" Then
Exit For
End If
Next
strTmp = Mid(MCC1, I)
If Len(strTmp) = 0 Then
MCC1 = "0"
Else
MCC1 = strTmp
End If
End If
End If
End If
End If
End Function
Private Sub Command1_Click()
Dim A, B, c
A = Trim(Text1): B = Trim(Text2)
ts = Timer
c = MCC1(Trim(A), Trim(B))
Text3 = c & "用时" & Timer - ts & "秒"
End Sub
Private Sub Command2_Click()
Text1 = ""
Text2 = ""
Text3 = ""
End Sub
Public Function MbC(D1 As String, D2 As String) As String
Dim j1&, j2&, e&, d&, E1&, m, n
' 按列法计算C=A*B
m = Trim(D1): n = Trim(D2)
X = Len(m) \ 4: Y = Len(n) \ 4
m = String(4 * X + 4 - Len(m), "0") & m
n = String(4 * Y + 4 - Len(n), "0") & n
X = X + 1: Y = Y + 1
Dim A(), B()
ReDim A(1 To X): ReDim B(1 To Y)
For i1 = 1 To X
A(i1) = Val(Mid(m, i1 * 4 - 3, 4))
Next
For i2 = 1 To Y
B(i2) = Val(Mid(n, i2 * 4 - 3, 4))
Next
ma = X: mb = Y
MC = ma + mb
ReDim c(MC)
E1 = 0
j1 = ma: j2 = ma
For I = MC To 2 Step -1
If I <= ma Then j2 = I - 1
e = E1: E1 = 0
For J = j1 To j2
e = e + A(J) * B(I - J)
If e > 2040000000 Then '减少进位次数
e = e - 2040000000
E1 = E1 + 204000
End If
Next J
If j1 > 1 Then j1 = j1 - 1
base = 10000
d = e \ base
c(I) = e - d * base
If Len(c(I)) < 4 Then
c(I) = String(4 - Len(c(I)), "0") & c(I)
Else
c(I) = c(I)
End If
jc = c(I) & jc
E1 = E1 + d
Next I
jc = d & jc
MbC = qqdl(Trim(jc))
End Function
Private Function qqdl(sa As String) As String
For I = 1 To Len(sa)
If Not Mid(sa, I, 1) = "0" Then
Exit For
End If
Next
strTmp = Mid(sa, I)
If Len(strTmp) = 0 Then
qqdl = "0"
Else
qqdl = strTmp
End If
End Function
Public Function MPC(D1 As String, D2 As String) As String ';jianfaqi
Dim X, Y ';两数长度
If qqdl(D2) = "0" Then
MPC = D1
Else
If Len(D1) >= Len(D2) Then
D4 = String(Len(D1) - Len(D2), "0") & D2
D3 = D1
Else
D4 = D2
D3 = String(Len(D2) - Len(D1), "0") & D1
End If
X = Len(D3) \ 8: Y = Len(D4) \ 8
D3 = String(8 * X + 8 - Len(D3), "0") & D3
D4 = String(8 * Y + 8 - Len(D4), "0") & D4
X = X + 1: Y = Y + 1
Dim A() As String, B1() As String, C1() As String, E1() As String
ReDim A(1 To X)
ReDim B1(1 To Y)
ReDim C1(1 To X)
ReDim E1(1 To X)
Dim I, J, C2, CJ, JW
For J = Y To 1 Step -1 ';D2
JW = 1 ';yu jie weichuzhi
B1(J) = Mid(D4, J * 8 - 7, 8) ';每位数
For I = X To 1 Step -1 ';D1
A(I) = Mid(D3, I * 8 - 7, 8) ';每位数
C1(I) = Val(1 & A(I)) - Val(B1(I)) - Val(1) + Val(JW) ';计算jia
If Len(C1(I)) <= 8 Then
JW = 0
C1(I) = String(8 - Len(C1(I)), "0") & C1(I)
Else
JW = Left(C1(I), Len(C1(I)) - 8)
End If
E1(I) = Right(C1(I), 8)
If Len(E1(I)) < 8 Then
E1(I) = String(8 - Len(E1(I)), "0") & E1(I)
Else
E1(I) = E1(I)
End If
Next
Next
For r = 1 To X
MPC = MPC & E1(r)
If Len(MPC) > Len(D1) Then
MPC = Mid(MPC, Len(MPC) - Len(D1) + 1)
Else
MPC = MPC
End If
For I = 1 To Len(MPC)
If Not Mid(MPC, I, 1) = "0" Then
Exit For
End If
Next
strTmp = Mid(MPC, I)
If Len(strTmp) = 0 Then
MPC = "0"
Else
MPC = strTmp
End If
Next
End If
End Function
Public Function MBJC(D1 As String, D2 As String) As String ';bijiao
If Len(D1) > Len(D2) Then
MBJC = 1
Else
If Len(D1) < Len(D2) Then
MBJC = -1
Else
If Len(D1) = Len(D2) Then
Dim X, Y
X = Len(D1) \ 4: Y = Len(D2) \ 4
Dim A() As String, B() As String
ReDim A(4 To 4 * X + 4)
ReDim B(4 To 4 * Y + 4)
If Val(Left(D1, Len(D1) - 4 * X)) > Val(Left(D2, Len(D2) - 4 * Y)) Then
MBJC = 1
Else
If Val(Left(D1, Len(D1) - 4 * X)) < Val(Left(D2, Len(D2) - 4 * Y)) Then
MBJC = -1
Else
For I = 4 To 4 * X Step 4
A(I) = Mid(D1, Len(D1) - I + 1, 4)
B(I) = Mid(D2, Len(D2) - I + 1, 4)
Next
J = 4 * X
Do While A(J) = B(J) And J >= 8
J = J - 4
Loop
If Val(A(J)) - Val(B(J)) > 0 Then
MBJC = 1
Else
If Val(A(J)) - Val(B(J)) < 0 Then
MBJC = -1
Else
MBJC = 0
End If
End If
End If
End If
End If
End If
End If
End Function
Public Function MCC(D1 As String, D2 As String) As String ';除数少于8位的除法
If Len(D1) < Len(D2) Then
MCC = "0" & "/" & D1
Else
If Len(D1) < 9 Then
MCC = Val(D1) \ Val(D2) & "/" & Val(D1) - (Val(D1) \ Val(D2)) * Val(D2)
If Mid(MCC, InStr(MCC, "/") + 1) = 0 Then
MCC = Left(MCC, InStr(MCC, "/") - 1)
Else
MCC = MCC
End If
Else
Dim X ';fen duan changdu
X = Len(D1)
Dim A() As String
ReDim A(1 To X) ';定义数组的储存空间
For I = 1 To X Step 1 ';把被除数各位放在a()中
A(I) = Mid(D1, I, 1)
Next I
Dim B() As String
JW = 0
ReDim B(1 To X)
For J = 1 To X Step 1
B(J) = Val(JW & A(J)) \ Val(D2)
JW = Val(JW & A(J)) - Val(B(J)) * Val(D2)
Next J
For r = 1 To X
If JW = 0 Then
MCC = MCC & B(r)
Else
CJ = CJ & B(r)
MCC = CJ & "/" & JW
End If
For I = 1 To Len(MCC)
If Not Mid(MCC, I, 1) = "0" Then
Exit For
End If
Next
strTmp = Mid(MCC, I)
If Len(strTmp) = 0 Then
MCC = "0"
Else
MCC = strTmp
End If
Next
End If
End If
End Function
Public Function MCC4(D1 As String, D2 As String) As String ';大整数的除法
Dim ss
ss = MBJC(D1, D2)
If ss = -1 Then
MCC4 = "0" & "/" & D1
Else
If ss = 0 Then
MCC4 = 1
Else
If Len(D1) = Len(D2) Then
Do While MBJC(D1, D2) >= 0
S1 = S1 + 1
D1 = MPC(D1, D2)
Loop
If D1 = 0 Then
MCC4 = S1
Else
MCC4 = S1 & "/" & D1
End If
Else
If Len(D2) < 9 Then
MCC4 = MCC(D1, D2)
Else
Dim X, Y ';定义分段长度
X = Len(D1) \ 4: Y = Len(D2) \ 4
If Len(D1) > 4 * X Then
X = X + 1
D1 = String(4 * X - Len(D1), "0") & D1
ElseIf Len(D2) > 4 * Y Then
Y = Y + 1
D2 = String(4 * Y - Len(D2), "0") & D2
Else
D1 = String(4 * X - Len(D1), "0") & D1
D2 = String(4 * Y - Len(D2), "0") & D2
End If
X = Len(D1) \ 4: Y = Len(D2) \ 4
Dim JW, jcc, jss, jcs
Dim A() As String, B() As String
ReDim A(1 To X)
ReDim B(1 To Y)
For I = 1 To X
A(I) = Mid(D1, I * 4 - 3, 4)
Next
For J = 1 To Y
B(J) = Mid(D2, J * 4 - 3, 4)
jws = jws & A(J)
Next
If Len(qqdl(Trim(jws))) <= Len(qqdl(D2)) Then
jcc = Val(Left(qqdl(A(1) & A(2)), 2)) \ Val(Left(qqdl(B(1) & B(2)), 2))
Else
jcc = Val(Left(qqdl(A(1) & A(2)), 2 + Len(qqdl(Trim(jws))) - Len(qqdl(D2)))) \ Val(Left(qqdl(B(1) & B(2)), 2))
End If
jss = MbC(Trim(jcc), D2)
Do While MBJC(Trim(jws), Trim(jss)) = -1
jcc = jcc - 1
jss = MbC(Trim(jcc), D2)
Loop
JW = MPC(Trim(jws), Trim(jss))
z = X - Y
Dim c() As String
ReDim c(1 To z)
For s = 1 To z
If MBJC(JW & A(s + Y), D2) = -1 Then
c(s) = "0000"
Else
If Len(qqdl(JW & A(s + Y))) = Len(qqdl(D2)) Then
jwc = Val(Left(qqdl(JW & A(s + Y)), 4)) \ Val(Left(qqdl(B(1) & B(2)), 4))
Else
If Len(qqdl(JW & A(s + Y))) <= Len(qqdl(D2)) Then
jwc = Val(Left(qqdl(JW & A(s + Y)), 4)) \ Val(Left(qqdl(B(1) & B(2)), 4))
Else
jwc = Val(Left(qqdl(JW & A(s + Y)), 4 + Len(qqdl(JW & A(s + Y))) - Len(qqdl(D2)))) \ Val(Left(qqdl(B(1) & B(2)), 4))
End If
End If
c(s) = jwc
End If
jsw = MbC(Trim(c(s)), Trim(D2))
Do While MBJC(JW & A(s + Y), Trim(jsw)) = -1
c(s) = c(s) - 1
jsw = MbC(Trim(c(s)), D2)
Loop
JW = MPC(JW & A(s + Y), MbC(Val(c(s)), D2))
Do While MBJC(Trim(JW), Trim(D2)) >= 0
jwc1 = jwc1 + 1
JW = MPC(Trim(JW), Trim(D2))
Loop
c(s) = Val(c(s) + jwc1)
c(s) = Right(100000000 + Val(c(s)), 4)
jcc = jcc & c(s)
Next s
If JW = 0 Then
MCC4 = jcc
Else
MCC4 = jcc & "/" & JW
End If
For I = 1 To Len(MCC4)
If Not Mid(MCC4, I, 1) = "0" Then
Exit For
End If
Next
strTmp = Mid(MCC4, I)
If Len(strTmp) = 0 Then
MCC4 = "0"
Else
MCC4 = strTmp
End If
End If
End If
End If
End If
End Function
|
|