摘要:[Visual Basic 6.0] 大整數運算 大數除法 (使用 Array 字串)
[Visual Basic 6.0] 大整數運算 大數除法 (使用 Array 字串)
四則大整數運算加減乘除中,大數除法是我認為最有挑戰性的。寫大數除法必須考慮到"借位"問題。
除法中的 "借位"問題 與 乘法中的 "借位" 問題來的困難一些,需要稍微讓腦袋轉動一下才有辦法完成。
在紙上運算 N 次與不斷的修改終於完成大整數除法,還有在判斷是否需要借位、補位上,或許是最具挑戰性的思考邏輯!
我用的方法就是數學運算最常使用的直式運算,而除法的處理方式是以每減一次則商數加一。
利用減法取代除法:
舉例一下:
9 / 3 = 3 (=9-3-3-3)
10 / 2 = 5 (=10-2-2-2-2-2)
'# [Visual Basic 6.0] 大整數運算 大數除法 (使用 Array 字串)
'# 0xDe
Private Sub Command1_Click()
Text3 = ""
A = Len(Text2) ' 目前位置
G = ""
NowA = Mid(Text1, 1, A)
NowB = Text2
Do Until Len(Text1) = A - 1 ' 全部抓完
' 判斷是否需要進位
S = False ' 一開始判斷為不需要進位
For I = 1 To Len(NowA)
If Val(Mid(NowB, I, 1)) <> Val(Mid(NowA, I, 1)) Then
If Val(Mid(NowB, I, 1)) < Val(Mid(NowA, I, 1)) Then ' 當 商數小餘除數時要進位
S = False: Exit For
Else
S = True: Exit For
End If
End If
Next I
If S Then ' 需要進位
Text3 = Text3 & G
G = 0
A = A + 1
NowA = NowA & Mid(Text1, A, 1)
NowB = "0" & NowB
Else
' 將目前的值放到陣列中
ReDim TxA(1 To Len(NowA))
ReDim TxB(1 To Len(NowB))
For I = 1 To Len(NowA)
TxA(I) = Mid(NowA, I, 1)
TxB(I) = Mid(NowB, I, 1)
Next I
' 從後面往前面減 不夠要借位
For I = Len(NowB) To 1 Step -1
' 判斷是否需要往前借
If Val(TxB(I)) > Val(TxA(I)) Then
X = I ' 目前位置
S = False
Do Until S ' 已經借到了
' 需要向前借位
X = X - 1
If Val(TxA(X)) <> 0 Then TxA(X) = TxA(X) - 1: S = True
Loop
For J = I - 1 To X + 1 Step -1
TxA(J) = Val(TxA(J)) + 9
Next J
TxA(I) = Val(TxA(I)) + 10
End If
TxA(I) = Val(TxA(I)) - Val(TxB(I))
Next I
Temp = ""
For I = 1 To Len(NowA)
Temp = Temp & TxA(I)
Next I
NowA = Temp
G = Val(G) + 1
End If
Loop
Do Until Mid(NowA, 1, 1) <> 0 Or Len(NowA) = 1 ' 將補位的 0 清空
NowA = Mid(NowA, 2)
Loop
If Text3 = "" Then Text3 = 0
Text3 = Text3 & "..." & NowA
End Sub
#0xDe 從分享中學習
#Facebook:ProgrammerDe (https://www.facebook.com/MicrosoftDes) 有問題歡迎提問