[Visual Basic 6.0] 大整數運算 大數除法 (使用 Array 字串)

摘要:[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

 

[Visual Basic 6.0] 大數除法.rar

#0xDe 從分享中學習

#Facebook:ProgrammerDe (https://www.facebook.com/MicrosoftDes) 有問題歡迎提問