关于模拟大数溢出的解决方案————加法篇 [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