我实现到这里了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

解决方案 »

  1.   

    hehe, you can use mathlab to get the result, and give it to your boss :)
      

  2.   

    arrnum1为第一个数的数组形式
    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
      

  3.   

    ' Module1
    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数组中试试看
      

  4.   

    算法没有经过运行验证。但思想就是这样了。其中Carry是个递归过程,要小心!
      

  5.   

    算法基本思想:
    1、n位数乘m位数,最多得到n+m位数;
    2、乘数的第j位乘以被乘数的第i位,与结果的i+j-1对齐;
    3、两个个位数相乘,最多是两位数;
    4、按位计算的局部结果和最终结果按位相加时,要考虑(连环)进位问题(Carry递归函数)
      

  6.   

    我的VB不熟,所以语句写得不算精炼。希望VB熟悉的朋友能精简一下。我只是表达了我的思想,可惜VB语法不熟练。:((
      

  7.   

    45分给我吧!
    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
      

  8.   

    hehe,纠正
    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
      

  9.   

    同意楼上的算法。
    另一个算法:
    '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
      

  10.   

    最后版本:
    ---------------------------------------
    '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
      

  11.   

    免费为你服务。下面的模块支持任意位数的(含小数)的乘法。
    ---------
    '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
      

  12.   

    xiaobinliu:
    数学问题。
      

  13.   

    我觉得好怪,真的想不明白
    msgbox 200*200                            -----溢出------
    msgbox val(cstr(200)) * val(cstr(200))    ------   40000  ---------
    真的不明白