我实现到这里了Private Type number
num As Integer
n As Integer
End Type
Dim var1, var2
Dim lenvar1, lenvar2
Dim enumber1() As number
Dim enumber2() As number
Dim enumberresult() As number
Private Sub Command1_Click()
'len(var1)=lenvar1
'var1=a1*10^b1+... var1 = Text1
var2 = Text2
lenvar1 = Len(var1)
lenvar2 = Len(var2)
ReDim enumber1(lenvar1)
ReDim enumber2(lenvar2)
ReDim enumberresult(lenvar1 * lenvar2)
For i = 1 To lenvar1
enumber1(i).num = Mid(var1, i, 1)
enumber1(i).n = lenvar1 - i
If Text3 = "" Then
Text3 = Text3 & Str(enumber1(i).num) & "*10^" & Str(enumber1(i).n) & " "
Else
Text3 = Text3 & "+" & Str(enumber1(i).num) & "*10^" & Str(enumber1(i).n) & " "
End If
Next
Text3 = "(" & Text3 & ")*("
For i = 1 To lenvar2
enumber2(i).num = Mid(var2, i, 1)
enumber2(i).n = lenvar2 - i
If Right(Text3, 1) = "(" Then
Text3 = Text3 & Str(enumber2(i).num) & "*10^" & Str(enumber2(i).n) & " "
Else
Text3 = Text3 & "+" & Str(enumber2(i).num) & "*10^" & Str(enumber2(i).n) & " "
End If
Next
Text3 = Text3 & ")"
Dim n
n = 0
For i = 1 To lenvar1
For j = 1 To lenvar2
n = n + 1
enumberresult(n).num = enumber1(i).num * enumber2(j).num
enumberresult(n).n = enumber1(i).n + enumber2(j).n
Next
Next
For i = 1 To n
If Text4 = "" Then
Text4 = Text4 & Str(enumberresult(i).num) & "*10^" & Str(enumberresult(i).n) & " "
Else
Text4 = Text4 & "+" & Str(enumberresult(i).num) & "*10^" & Str(enumberresult(i).n) & " "
End If
Next
'12*10^ 8 + 18*10^ 7 + 24*10^ 6 + 10*10^ 7 + 15*10^ 6 +
'20*10^ 5 + 8*10^ 6 + 12*10^ 5 + 16*10^ 4 + 10*10^ 5 +
'15*10^ 4 + 20*10^ 3 + 12*10^ 4 + 18*10^ 3 + 24*10^ 2 +
'14*10^ 3 + 21*10^ 2 + 28*10^ 1 + 16*10^ 2 + 24*10^ 1 + 32*10^ 0
'首先把同n的加起来,拆成num=一位的,
'循环直到都变成num=一位的,n也完全不同,
'然后按照n高到底排序,
'然后把num合并起来 'Do While onlyone(enumberresult)
'Loop
'Text4 = ""
'enumberresult = OrderMe(enumberresult)
ReDim enumberresult(2)
enumberresult(1).n = 1
enumberresult(1).num = 2
enumberresult(2).n = 0
enumberresult(2).num = 3
'For i = 1 To UBound(enumberresult)
' Text4 = Text4 & enumberresult(i).num
'Next
End Sub
'判断都满足^完全不同,而且都变成一位的
'Function onlyone(ByRef enumber As number) As Boolean
' onlyone = False
'End Function
'Function OrderMe(ByRef enumber As number)
' OrderMe = enumber
'End Function
num As Integer
n As Integer
End Type
Dim var1, var2
Dim lenvar1, lenvar2
Dim enumber1() As number
Dim enumber2() As number
Dim enumberresult() As number
Private Sub Command1_Click()
'len(var1)=lenvar1
'var1=a1*10^b1+... var1 = Text1
var2 = Text2
lenvar1 = Len(var1)
lenvar2 = Len(var2)
ReDim enumber1(lenvar1)
ReDim enumber2(lenvar2)
ReDim enumberresult(lenvar1 * lenvar2)
For i = 1 To lenvar1
enumber1(i).num = Mid(var1, i, 1)
enumber1(i).n = lenvar1 - i
If Text3 = "" Then
Text3 = Text3 & Str(enumber1(i).num) & "*10^" & Str(enumber1(i).n) & " "
Else
Text3 = Text3 & "+" & Str(enumber1(i).num) & "*10^" & Str(enumber1(i).n) & " "
End If
Next
Text3 = "(" & Text3 & ")*("
For i = 1 To lenvar2
enumber2(i).num = Mid(var2, i, 1)
enumber2(i).n = lenvar2 - i
If Right(Text3, 1) = "(" Then
Text3 = Text3 & Str(enumber2(i).num) & "*10^" & Str(enumber2(i).n) & " "
Else
Text3 = Text3 & "+" & Str(enumber2(i).num) & "*10^" & Str(enumber2(i).n) & " "
End If
Next
Text3 = Text3 & ")"
Dim n
n = 0
For i = 1 To lenvar1
For j = 1 To lenvar2
n = n + 1
enumberresult(n).num = enumber1(i).num * enumber2(j).num
enumberresult(n).n = enumber1(i).n + enumber2(j).n
Next
Next
For i = 1 To n
If Text4 = "" Then
Text4 = Text4 & Str(enumberresult(i).num) & "*10^" & Str(enumberresult(i).n) & " "
Else
Text4 = Text4 & "+" & Str(enumberresult(i).num) & "*10^" & Str(enumberresult(i).n) & " "
End If
Next
'12*10^ 8 + 18*10^ 7 + 24*10^ 6 + 10*10^ 7 + 15*10^ 6 +
'20*10^ 5 + 8*10^ 6 + 12*10^ 5 + 16*10^ 4 + 10*10^ 5 +
'15*10^ 4 + 20*10^ 3 + 12*10^ 4 + 18*10^ 3 + 24*10^ 2 +
'14*10^ 3 + 21*10^ 2 + 28*10^ 1 + 16*10^ 2 + 24*10^ 1 + 32*10^ 0
'首先把同n的加起来,拆成num=一位的,
'循环直到都变成num=一位的,n也完全不同,
'然后按照n高到底排序,
'然后把num合并起来 'Do While onlyone(enumberresult)
'Loop
'Text4 = ""
'enumberresult = OrderMe(enumberresult)
ReDim enumberresult(2)
enumberresult(1).n = 1
enumberresult(1).num = 2
enumberresult(2).n = 0
enumberresult(2).num = 3
'For i = 1 To UBound(enumberresult)
' Text4 = Text4 & enumberresult(i).num
'Next
End Sub
'判断都满足^完全不同,而且都变成一位的
'Function onlyone(ByRef enumber As number) As Boolean
' onlyone = False
'End Function
'Function OrderMe(ByRef enumber As number)
' OrderMe = enumber
'End Function
解决方案 »
- 为什么我做的ActiveX控件总不可见?
- Connection高手解答,绝对有价值的讨论!★★
- 关于timer的问题
- 一个用第三方win32标准函数库(海康DS40xxSDK.dll)开发系统的问题,请高人们赐教!!!
- Listview如何定位最后一行.
- 关于重启计算机的问题
- 给位请帮忙!
- 请问vb中如何实现两个窗口合并,就象属性窗口和工程管理器窗口一样?
- 请教关于CRYSTAL REPORTS的问题?
- 请问清华大学bbs的IP、端口?
- 我需要做一个文件扫描的控件,以前从没接触过这方面,大家能给些建议吗?比如,那里有源程序参考,或者那里可以下载这样的控件?????
- 如何清空ACCESS中的日期字段
arrnum2为第二个数的数组形式
arrnum3为结果的数组形式
则算法如下:
For i = LBound(arrnum1) To UBound(arrnum1)
For j = LBound(arrnum2) To UBound(arrnum2)
tmp = arrnum1(i) * arrnum2(j)
If tmp / 10 > 1 Then
arrnum3(i + j - 1) = arrnum3(i + j - 1) + (tmp Mod 10)
arrnum3(i + j) = arrnum3(i + j) + (tmp / 10)
Else
arrnum3(i + j - 1) = arrnum3(i + j - 1) + tmp
End If
Next j
Next i
Option ExplicitPublic Pos As Integer
Public Len1 As Integer
Public Len2 As Integer
Public Len3 As Integer
Public strResuilt As String
Public A1() As String * 1
Public A2() As String * 1
Public aResuilt() As String * 1
Public Sub Define(ByVal str1 As String, ByVal str2 As String)
Dim A As Integer
Len1 = Len(str1)
Len2 = Len(str2)
Len3 = Len1 + Len2
strResuilt = Space(Len3)
ReDim aResuilt(1 To (Len3))
ReDim A1(1 To Len1)
ReDim A2(1 To Len2)
A1 = str1
A2 = str2
For A = 1 To Len3
aResuilt(A) = "0"
Next
'aResuilt = strResuiltEnd SubPublic Sub Cal(ByVal str1 As String, ByVal str2 As String)
Dim I As Integer
Dim J As Integer
Dim X As Integer
Dim Y As Integer
Dim Z As Integer
Dim strTemp As String
Dim LenT As Integer
Define str1, str2
For I = Len1 To 1 Step -1
For J = Len2 To 1 Step -1
X = Val(A1(I))
Y = Val(A2(I))
Z = X * Y
strTemp = Trim(str(Z))
LenT = Len(strTemp)
SumUp I, J, Z, LenT
Next
Next
End SubSub SumUp(ByVal I As Integer, ByVal J As Integer, ByVal Num As Integer, ByVal L As Integer)
Dim T As Integer
Dim K As Integer
Dim KK As Integer
Dim B(1 To 2) As String * 1
KK = 0
B = Trim(str(Num))
For T = 1 To L
K = Val(B(2 - T + 1)) + Val(aResuilt(J + I - 1 + T - 1))
Carry J + I - 1 + T - 1, K Mod 10
If K >= 10 Then
Carry J + I - 1 + T, K \ 10
End If
Next
End SubPublic Sub Carry(ByVal S As Integer, ByVal V As Integer)
Dim VV As Integer
Dim Q As Integer
VV = Val(aResuilt(Q)) + V
If VV >= 10 Then
aResuilt(Q) = str(VV Mod 10)
Carry Q - 1, VV \ 10
Else
aResuilt(Q) = str(VV)
End If
End Sub
-------------------------------------
在你的事件过程中调用CAL(STRING1,STRING2)
结果在aResuilt数组中试试看
1、n位数乘m位数,最多得到n+m位数;
2、乘数的第j位乘以被乘数的第i位,与结果的i+j-1对齐;
3、两个个位数相乘,最多是两位数;
4、按位计算的局部结果和最终结果按位相加时,要考虑(连环)进位问题(Carry递归函数)
a、b分别为两个相乘的数(任意长度)调用multiply既可.
Private Function multiply(a As String, b As String) As String
Dim strResult As String
Dim lngTem As Long
Dim intX As Integer
For intX = 1 To Len(a)
Debug.Print CStr(Mid(a, Len(a) - intX + 1) * b) & MutiChar("0", intX - 1)
strResult = Add(strResult, CStr(Mid(a, Len(a) - intX + 1, 1) * b) & MutiChar("0", intX - 1), 0)
Next intX
sum = strResult
End FunctionPrivate Function Add(a As String, b As String, inValue As Integer) As String
Dim Upvalue As Integer
Dim x As String
Dim y As String
If a = "" Then a = 0
If b = "" Then b = 0
Upvalue = CInt(Right(a, 1)) + CInt(Right(b, 1)) + inValue
If Len(a) = 1 And Len(b) = 1 Then
Add = CStr(Upvalue)
Else
If Len(a) = 1 Then x = "0" Else x = Left(a, Len(a) - 1)
If Len(b) = 1 Then y = "0" Else y = Left(b, Len(b) - 1)
If Upvalue >= 10 Then
Add = Add(x, y, 1) & CStr(Upvalue - 10)
Else
Add = Add(x, y, 0) & CStr(Upvalue)
End If
End If
End Function
Private Function MutiChar(m As String, number As Integer) As String
Dim x As Integer
Dim strTem As String
For x = 1 To number
strTem = strTem & m
Next x
MutiChar = strTem
End Function
Private Function multiply(a As String, b As String) As String
Dim strResult As String
Dim strTem As String
Dim lngTem As Long
Dim intX As Integer
Dim intY As Integer
For intX = 1 To Len(a)
'Debug.Print Mid(a, Len(a) - intX + 1, 1)
strTem = ""
For intY = 1 To Mid(a, Len(a) - intX + 1, 1)
strTem = Add(strTem, b, 0)
Next intY
strResult = Add(strResult, strTem & MutiChar("0", intX - 1), 0)
Next intX
multiply = strResult
End Function
另一个算法:
'Module1Option ExplicitPublic Pos As Integer
Public Len1 As Integer
Public Len2 As Integer
Public Len3 As Integer
Public strResuilt As String
Public A1() As String * 1
Public A2() As String * 1
Public aResuilt() As String * 1
Public Sub Define(ByVal str1 As String, ByVal str2 As String)
Dim a As Integer
Dim I As Integer
Len1 = Len(str1)
Len2 = Len(str2)
Len3 = Len1 + Len2
strResuilt = Space(Len3)
ReDim aResuilt(1 To (Len3))
ReDim A1(1 To Len1)
ReDim A2(1 To Len2)
For I = 1 To Len1
A1(I) = Mid(str1, I, 1)
Next
For I = 1 To Len2
A2(I) = Mid(str2, I, 1)
Next
For a = 1 To Len3
aResuilt(a) = "0"
Next
End SubPublic Function Multiply(ByVal str1 As String, ByVal str2 As String) As String
Dim I As Integer
Dim J As Integer
Dim x As Integer
Dim y As Integer
Dim Z As Integer
Dim strTemp As String
Dim LenT As Integer
Define str1, str2
For I = Len1 To 1 Step -1
For J = Len2 To 1 Step -1
x = Val(A1(I))
y = Val(A2(J))
Z = x * y
strTemp = Trim(str(Z))
LenT = Len(strTemp)
SumUp I, J, Z, LenT
Next
Next
For I = 1 To UBound(aResuilt)
If aResuilt(I) <> " " Then
Multiply = Multiply & aResuilt(I)
End If
Next
End FunctionSub SumUp(ByVal I As Integer, ByVal J As Integer, ByVal Num As Integer, ByVal L As Integer)
Dim T As Integer
Dim K As Integer
Dim KK As Integer
Dim b(1 To 2) As String * 1
KK = 0
For T = 1 To L
b(T) = Mid(Trim(str(Num)), T, 1)
Next
For T = 1 To L
Carry J + I + 1 - T, Val(b(L - T + 1))
Next
'去掉结果数组前面的零
For T = 1 To Len3
If aResuilt(T) = "0" Then
aResuilt(T) = " "
Else
Exit For
End If
NextEnd SubPublic Sub Carry(ByVal S As Integer, ByVal V As Integer)
Dim VV As Integer
Dim Q As Integer
VV = Val(aResuilt(S)) + V
If VV >= 10 Then
aResuilt(S) = Trim(str(VV Mod 10))
Carry S - 1, VV \ 10
Else
aResuilt(S) = Trim(str$(VV))
End If
End Sub
------------------------------------
在窗体上画三个textbox和一个command
加入下面的语句:
Option ExplicitPrivate Sub Command1_Click()
Text3.Text = Multiply(Text1.Text, Text2.Text)
End Sub
---------------------------------------
'Module1Option ExplicitPublic Len1 As Integer
Public Len2 As Integer
Public Len3 As Integer
Public strResuilt As StringPublic Function Multiply(ByVal str1 As String, ByVal str2 As String) As String
Dim I As Integer
Dim J As Integer
Dim X As Integer
Dim Y As Integer
Dim Z As Integer
str1 = Trim(str1)
str2 = Trim(str2)
Len1 = Len(str1)
Len2 = Len(str2)
Len3 = Len1 + Len2
strResuilt = Space(Len3)
For I = Len1 To 1 Step -1
For J = Len2 To 1 Step -1
X = Val(Mid(str1, I, 1))
Y = Val(Mid(str2, J, 1))
Z = X * Y
SumUp I, J, Z, Len(Trim(Str(Z)))
Next
Next
Multiply = Trim(strResuilt)
End FunctionSub SumUp(ByVal I As Integer, ByVal J As Integer, ByVal Num As Integer, ByVal L As Integer)
Dim T As Integer
For T = 1 To L
Carry J + I + 1 - T, Val(Mid(Trim(Num), (L - T + 1), 1))
Next
End SubPublic Sub Carry(ByVal S As Integer, ByVal V As Integer)
Dim VV As Integer
VV = Val(Mid(strResuilt, S, 1)) + V
If VV >= 10 Then
Mid(strResuilt, S, 1) = Trim(Str(VV Mod 10))
Carry S - 1, VV \ 10
Else
Mid(strResuilt, S, 1) = Trim(Str(VV))
End If
End Sub
------------------------------------------------------
'form1
Option ExplicitPrivate Sub Command1_Click()
Text3.Text = Multiply(Text1.Text, Text2.Text)
Text4.Text = Multiply1(Text1.Text, Text2.Text)
End Sub
---------
'Module1Option ExplicitPublic Len1 As Integer
Public Len2 As Integer
Public Len3 As Integer
Public strResuilt As String
Public Dot1 As Integer
Public Dot2 As IntegerPublic Function Multiply(ByVal str1 As String, ByVal str2 As String) As String
Dim I As Integer
Dim J As Integer
Dim X As Integer
Dim Y As Integer
Dim Z As Integer
If Not (IsRight(str1, Dot1) And IsRight(str2, Dot2)) Then
Multiply = "输入数字有错"
Exit Function
End If
str1 = Trim(str1)
str2 = Trim(str2)
Len1 = Len(str1)
Len2 = Len(str2)
Len3 = Len1 + Len2
strResuilt = Space(Len3)
For I = Len1 To 1 Step -1
For J = Len2 To 1 Step -1
X = Val(Mid(str1, I, 1))
Y = Val(Mid(str2, J, 1))
Z = X * Y
SumUp I, J, Z, Len(Trim(Str(Z)))
Next
Next
strResuilt = Left(Trim(strResuilt), Len(Trim(strResuilt)) - Dot1 - Dot2) & "." & Right(Trim(strResuilt), Dot1 + Dot2)
If (Dot1 + Dot2) <> 0 Then
For I = Len(Trim(strResuilt)) To 1 Step -1
If Mid(strResuilt, I, 1) = "0" Then
Mid(strResuilt, I, 1) = " "
Else
Exit For
End If
Next
End If
Multiply = Trim(strResuilt)
If Mid(Multiply, Len(Multiply), 1) = "." Then
Multiply = Left(Multiply, Len(Multiply) - 1)
End If
End FunctionSub SumUp(ByVal I As Integer, ByVal J As Integer, ByVal Num As Integer, ByVal L As Integer)
Dim T As Integer
For T = 1 To L
Carry J + I + 1 - T, Val(Mid(Trim(Num), (L - T + 1), 1))
Next
End SubPublic Sub Carry(ByVal S As Integer, ByVal V As Integer)
Dim VV As Integer
VV = Val(Mid(strResuilt, S, 1)) + V
If VV >= 10 Then
Mid(strResuilt, S, 1) = Trim(Str(VV Mod 10))
Carry S - 1, VV \ 10
Else
Mid(strResuilt, S, 1) = Trim(Str(VV))
End If
End SubPrivate Function IsRight(ByRef str1 As String, ByRef Dot As Integer) As Boolean
Dim I As Integer
Dim NumDot As Integer
str1 = Trim(str1)
IsRight = True
NumDot = 0
Dot = 0
For I = 1 To Len(str1)
If Mid(str1, I, 1) < "0" And Mid(str1, I, 1) = "." Or Mid(str1, I, 1) >= "0" And Mid(str1, I, 1) <= "9" Then
If Mid(str1, I, 1) = "." Then
NumDot = NumDot + 1
Dot = Len(str1) - I
If NumDot > 1 Then
IsRight = False
Exit For
End If
End If
Else
IsRight = False
Exit For
End If
Next
If IsRight Then
str1 = Replace(str1, ".", "", 1)
End If
End Function
数学问题。
msgbox 200*200 -----溢出------
msgbox val(cstr(200)) * val(cstr(200)) ------ 40000 ---------
真的不明白