您的位置:首页 > 编程语言 > VB

关于模拟大数溢出的解决方案————加法篇

2006-04-17 23:23 471 查看
关于模拟大数溢出的解决方案————加法篇 [2005-12-27]

Option Explicit

Private Sub Command5_Click()
    Dim strSTemp1 As String, strSTemp2 As String
    Dim i As Long, j As Long
    i = timeGetTime()
    If Combo1.Text = "+" Then
        Text3 = mAddition(Text1, Text2)
    ElseIf Combo1.Text = "-" Then
        MsgBox "缺少功能!", vbExclamation
    ElseIf Combo1.Text = "×" Then

    ElseIf Combo1.Text = "÷" Then
        MsgBox "缺少功能!", vbExclamation
    Else
        MsgBox "尚未指定运算符!", vbExclamation
        Exit Sub
    End If
    j = timeGetTime
    i = j - i
    Label2.Caption = "您使用了" & Combo1.Text & "法运算,  共用时: " & i & "  毫秒"
End Sub
'====================================================
Attribute VB_Name = "mdlDeclare"
Option Explicit

Public Declare Function timeGetTime Lib "winmm.dll" () As Long

'n位数运算模拟过程——加法
Function mAddition(ByVal atExpLeft As String, ByVal atExpRight As String) As String
    '--------------------左数值                    右数值
    'A+B  ==> 123456789 + 1234567890  ==> 00123456789 + 01234567890  ==> 01358024679
    Dim maxLen As Long '估计总长度
    Dim alLen As Long, arLen As Long '各数的长度
    Dim atTemp() As Integer '临时数组
    Dim i As Long, j As Long 'j为字符串左边非0的字符串长度
    Dim atCarry As String, atvalue As String   '进位的值,临时的和
    Dim atValLeft As Integer, atValRight As Integer '分解后的单个数值
    Dim atStr As String

    alLen = Len(atExpLeft): arLen = Len(atExpRight)

    If alLen >= arLen Then
        maxLen = alLen + 1
    Else
        maxLen = arLen + 1
    End If

    atExpLeft = mMidString(atExpLeft, maxLen, alLen)
    atExpRight = mMidString(atExpRight, maxLen, arLen)

    ReDim atTemp(1 To 2)
    atCarry = "0"
    atvalue = "0"
    For i = maxLen To 1 Step -1
        atValLeft = CInt(Mid(atExpLeft, i, 1))
        atValRight = CInt(Mid(atExpRight, i, 1))
        atvalue = Format(CStr(atValLeft + atValRight + CInt(atCarry)), "00")

        atCarry = CInt(Mid(CStr(atvalue), 1, 1))
        atvalue = CInt(Mid(CStr(atvalue), 2, 1))

        mAddition = atvalue & mAddition
    Next

    For i = 1 To maxLen
        atStr = Mid(mAddition, i, 1)
        If Not atStr = "0" Then
            j = maxLen - i + 1
            Exit For
        End If
    Next i
    mAddition = Right(mAddition, j)
    Exit Function
err:
    MsgBox "Error Code"
    Exit Function
End Function

'===================================================
Function mMidString(ByVal msString As String, ByVal msMaxLen As Long, ByVal msLen As Long) As String
    '---------------------待分解的字符串          估计最大长度          字符串长度

    Dim sTemp() As Long
    Dim i As Long, j As Long
    If msMaxLen <= msLen Then GoTo ErrLen

    ReDim sTemp(1 To msMaxLen)

    'For i = 1 To MaxLen
    '    sTemp(i) = 0
    'Next i

    For i = 1 To msMaxLen ' Step -1
        On Error Resume Next
        sTemp(msMaxLen - i + 1) = CLng(Mid(msString, (msLen + 1 - i), 1))
    Next i

    For i = 1 To msMaxLen ' Step -1
        mMidString = mMidString & CStr(sTemp(i))
    Next
    Exit Function
ErrLen:
    MsgBox "    字符串长度不符合规则," + Chr$(13) + Chr$(10) + _
           "“ msMaxLen > msLen  ” 并且 " + Chr$(13) + Chr$(10) + _
           "“ msMaxLen ”大于最大“ msLen ”值“ 1 ”!", vbExclamation
    mMidString = "0"
    Exit Function
End Function

 
 
 
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息