Hallo
ich hab da mal ein kleines Provlem.
Ich müsste mit sehr langen Zahlen rechnen (über 100.000 Stellen).
Hab mir deshalb einiges zusammengesucht und um vb.net umgeschrieben.
Allerdings werden keine Komma-Stellen unterstützt.
Mein Code bisher ist folgender:
Module MATHs
Public Function LTrim0(ByVal strVar As String) As String
Do Until Len(strVar) = 1 Or Left$(strVar, 1) <> "0"
strVar = Mid$(strVar, 2)
Loop
LTrim0 = strVar
End Function
Public Function Add(ByVal strNo1 As String, ByVal strNo2 As String) As _
String
Dim bytSum As Byte
Dim bytCarry As Byte
Dim lngMax As Long
Dim lngVar As Long
Dim strSum As String = ""
strNo1 = LTrim0(strNo1)
strNo2 = LTrim0(strNo2)
lngMax = IIf(Len(strNo1) > Len(strNo2), Len(strNo1), Len(strNo2))
strNo1 = Right$(New String("0", lngMax) & strNo1, lngMax)
strNo2 = Right$(New String("0", lngMax) & strNo2, lngMax)
For lngVar = Len(strNo1) To 1 Step -1
bytSum = Val(Mid$(strNo1, lngVar, 1)) + Val(Mid$(strNo2, lngVar, _
1)) + bytCarry
strSum = bytSum Mod 10 & strSum
bytCarry = bytSum \ 10
Next lngVar
If bytCarry Then strSum = bytCarry & strSum
Return strSum
End Function
Public Function Divide(ByVal strNo1 As String, ByVal strNo2 As String) As _
String
Dim bytQuo As Byte
Dim lngVar As Long
Dim strQuo As String = ""
Dim strDiv As String = ""
Dim strVar As String = ""
strNo1 = LTrim0(strNo1)
strNo2 = LTrim0(strNo2)
lngVar = Len(strNo2)
strDiv = Left$(strNo1, lngVar)
Do While lngVar <= Len(strNo1)
strVar = Subtract(strDiv, strNo2)
bytQuo = 0
Do While Left$(strVar, 1) <> "-"
bytQuo = bytQuo + 1
strVar = Subtract(strVar, strNo2)
Loop
strQuo = strQuo & CStr(bytQuo)
lngVar = lngVar + 1
strDiv = Subtract(strNo2, Mid$(strVar, 2)) & Mid$(strNo1, lngVar, 1)
Loop
Return LTrim0(strQuo)
End Function
Public Function Modulo(ByVal strNo1 As String, ByVal strNo2 As String) As _
String
Return Subtract(strNo1, Multiply(strNo2, Divide(strNo1, strNo2)))
End Function
Public Function Multiply(ByVal strNo1 As String, ByVal strNo2 As String) As _
String
Dim bytPrd As Byte, bytCarry As Byte
Dim lngVar1 As Long, lngVar2 As Long
Dim strPrd As String, strVar As String
strNo1 = LTrim0(strNo1)
strNo2 = LTrim0(strNo2)
If Len(strNo1) > Len(strNo2) Then
strVar = strNo1
strNo1 = strNo2
strNo2 = strVar
End If
strPrd = "0"
For lngVar1 = Len(strNo1) To 1 Step -1
strVar = New String("0", Len(strNo1) - lngVar1)
bytCarry = 0
For lngVar2 = Len(strNo2) To 1 Step -1
bytPrd = Mid$(strNo1, lngVar1, 1) * Mid$(strNo2, lngVar2, 1) + _
bytCarry
strVar = bytPrd Mod 10 & strVar
bytCarry = bytPrd \ 10
Next lngVar2
If bytCarry Then strVar = bytCarry & strVar
strPrd = Add(strPrd, strVar)
Next lngVar1
Return strPrd
End Function
Public Function Subtract(ByVal strNo1 As String, ByVal strNo2 As String) As _
String
Dim bytDif As Byte
Dim bytCarry As Byte
Dim lngVar As Long
Dim strDif As String = ""
Dim strVar As String = ""
strNo1 = LTrim0(strNo1)
strNo2 = LTrim0(strNo2)
If Len(strNo1) < Len(strNo2) Or (Len(strNo1) = Len(strNo2) And strNo1 < _
strNo2) Then
strVar = strNo1
strNo1 = strNo2
strNo2 = strVar
End If
strNo2 = Right$(New String("0", Len(strNo1)) & strNo2, Len(strNo1))
For lngVar = Len(strNo1) To 1 Step -1
bytDif = Val(Mid$(strNo1, lngVar, 1)) - Val(Mid$(strNo2, lngVar, _
1)) - bytCarry + 10
strDif = bytDif Mod 10 & strDif
bytCarry = 1 - bytDif \ 10
Next lngVar
strDif = LTrim0(strDif)
If strVar > "" Then strDif = "-" & strDif
Return strDif
End Function
End Module Kann mir bitte jemand helfen?
Ich versteh das nämlich nicht so ganz.
Gruß Aicher |