关于模拟大数溢出的解决方案————加法篇
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
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
相关文章推荐
- 关于android4.0模拟键盘不能使用的bug解决方案
- hdu 1002 A + B Problem II(大数模拟加法)
- 用数组模拟大数加法模板
- HDU 1865 1sting(大数斐波那契数列,模拟加法)
- HDU 1753 大明A+B(大数加法,数组模拟)
- 51nod1005---大数加法(51nod基础:加减模拟)
- hdu 1002 A + B Problem II(大数模拟加法)
- 关于大数加法的解法
- POJ 2506 Tiling (递推 + 大数加法模拟 )
- 关于tomcat7内存溢出问题解决方案:ava.lang.OutOfMemoryError: PermGen space
- C#,关于大数之间的加法
- 关于Java内存溢出详解及解决方案的文章的转载
- 关于HttpClient模拟浏览器请求的参数乱码问题解决方案
- uva 10523 Very Easy !!! 大数模拟加法和乘法
- POJ 2602 Superlong sums(模拟大数加法)
- Very Easy !!! (大数模拟加法乘法)
- HDU(A+B2)(大数加法模拟)
- JAVA关于POI导出Excel内存溢出的解决方案
- [ACM]模拟大数加法
- 关于CSS中单行文本溢出的解决方案