发布网友
共2个回答
热心网友
我没有用你的提供的方法,不过一样也实现了
传入参数是两个字符型的数字,可以计算几千位的乘法也没问题
如
Private Sub Form_Click()
Dim S1 as string,S2 as string
S1="23852903851025802158185019248203402395780995725252356236"
S2="12341249237857205204529017401750734235794762353465"
Print ChengFa(S1,S2)
End Sub
Function ChengFa(ByVal M As String, ByVal N As String) As String
'用于大数相乘
Dim A() As Integer, B() As Integer, S() As Integer
ReDim A(Len(M)) As Integer, B(Len(N)) As Integer, S(Len(M) + Len(N)) As Integer
For i = 1 To Len(M)
A(i) = Val(Mid(StrReverse(M), i, 1))
Next
For i = 1 To Len(N)
B(i) = Val(Mid(StrReverse(N), i, 1))
Next
For i = 1 To Len(M)
For j = 1 To Len(N)
S(i + j - 1) = S(i + j - 1) + A(i) * B(j)
Next
Next
For i = 1 To Len(M) + Len(N)
If S(i) > 9 Then
S(i + 1) = S(i + 1) + S(i) \ 10
S(i) = S(i) Mod 10
End If
Next
For i = Len(M) + Len(N) To 1 Step -1
ChengFa = ChengFa & IIf(S(i) = 0, " ", S(i))
Next
ChengFa = Replace(LTrim((ChengFa)), " ", 0)
End Function
热心网友
'////////////////////////////////////////////////////////////////////////////////////////////////////////////
'********** *****************
'********** 通用乘法(multiplication) 时间:2007.1.12 姓名:ActiveZfj *****************
'********** *****************
'********** 通过调用整数乘法函数完成任何乘法运算(整数运算或小数运算) *****************
'\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
Public Function MultipStr(strNum1 As String, strNum2 As String) As String
Call GetIntPoint(strNum1, strNum2) '分离整数部分与小
If bPoint1 Then '将数1的小数部分与整数部分连接为一个整数
strNum1 = strNumber1 & strPt1
Else
strNum1 = strNumber1
End If
If bPoint2 Then
strNum2 = strNumber2 & strPt2
Else
strNum2 = strNumber2
End If
MultipStr = ""
myTem = MultipInt(strNum1, strNum2) '调用整数相乘
'构造正确的数据结构
If bPoint1 And bPoint2 Then '均有小数则小数总位数等于两者之和
'从整数相乘结果中取整数部分
MultipStr = Mid(myTem, 1, Len(myTem) - (Len(strNum1) + Len(strNum2) - (sPoint1 + sPoint2 - 2)))
MultipStr = MultipStr & "." '增加小数点
'从整数相乘结果中取小数部分
MultipStr = MultipStr & Right(myTem, Len(strNum1) + Len(strNum2) - (sPoint1 + sPoint2 - 2))
ElseIf bPoint1 And bPoint2 = False Then '只有数1有小数,则小数位数等于数1小数位数
MultipStr = Mid(myTem, 1, Len(myTem) - (Len(strNum1) - sPoint1 + 1))
MultipStr = MultipStr & "."
MultipStr = MultipStr & Right(myTem, Len(strNum1) - sPoint1 + 1)
ElseIf bPoint1 = False And bPoint2 Then '只有数2有小数,则小数位数等于数2小数位数
MultipStr = Mid(myTem, 1, Len(myTem) - (Len(strNum2) - sPoint2 + 1))
MultipStr = MultipStr & "."
MultipStr = MultipStr & Right(myTem, Len(strNum2) - sPoint2 + 1)
Else '均无小数,则结果为整数相乘结果
MultipStr = myTem
End If
If bPoint1 Or bPoint2 Then MultipStr = CutZero(MultipStr, 1) '若有小数则消除后导0
MultipStr = CutZero(MultipStr, 0) '消除前导0
End Function
'////////////////////////////////////////////////////////////////////////////////////////////////////////////
'********** *****************
'********** 整数乘法(multiplication) 时间:2007.1.12 姓名:ActiveZfj *****************
'********** *****************
'********** 通过按字符分割方法,可以完成任意长度值的两数相减 *****************
'\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
Public Function MultipInt(strN1 As String, strN2 As String) As String
Dim L1, L2 As Integer
Dim sTem As String
Dim I As Integer
Dim K As Integer
Dim JiSuan As Integer
Dim Result() As String '记录每个乘积
L1 = Len(strN1) '获得字符串长度
L2 = Len(strN2)
If L1 < L2 Then '若字符串1小于字符串2则交换字符串
sTem = strN2
strN2 = strN1
strN1 = sTem
L1 = Len(strN1)
L2 = Len(strN2)
End If
ReDim Result(1 To L2) As String '定义L2个字符数组(及乘数位数个)
For I = L2 To 1 Step -1
Result(I) = "" '初始值为空
For K = 1 To L2 - I '在后面补0
Result(I) = "0" & Result(I)
Next K
JinWei = 0
For K = L1 To 1 Step -1
JiSuan = CInt(Mid(strN1, K, 1)) * CInt(Mid(strN2, I, 1)) + JinWei
Result(I) = Trim(Str(JiSuan Mod 10)) & Result(I)
JinWei = JiSuan \ 10
Next K
If JinWei > 0 Then Result(I) = Str(JinWei) & Result(I)
Next I
MultipInt = "0" '各项求和
For I = 1 To L2
MultipInt = AddIntNum(MultipInt, Result(I))
Next I
End Function
参考资料:http://free.getbbs.com/Post/Topic.aspx?TID=6686160