Bonjour
Je cherche a faire une operation sur les tres grands nombres.
C'est à dire une centaine de chiffres.
En visual basic j'ai trouvé un code qui permet de le faire en utilisant des strings, et apparement c'est sans limite et ça marche nickel.
Malheureusement je ne suis pas assez calé pour le convertir en purebasic.
Si quelqu'un se sent le courage cela me dépannerais beaucoup, et apparement je ne devrait pas etre le seul car en cherchant sur le net et sur ce site je n'ai rien trouvé de pareil.
Hors mis la librairie F64, mais malheureusement elle ne marche pas non plus a partir d'un certain nombre de chiffres, elle donne des resultats faux.
Peut etre l'ai-je mal utilisée ????
Voici le code VB:
' MULTIPLICATION
' **************
Public Function BigMultiplication(Term1 As String, Term2 As String)
Total2 = "0"
Dim Nbd, Nbt, Nbu As Integer
For i = 0 To Len(Term2) - 1
Nbd = 0
Total = ""
Nbr2 = Mid(Term2, Len(Term2) - i, 1)
For a = 0 To Len(Term1) - 1
Nb1 = Mid(Term1, Len(Term1) - a, 1)
Nbt = Nb1 * Nbr2 + Nbd
Nbd = Nbt \ 10: Nbu = Nbt Mod 10
Total = Nbu & Total
Next a
Total2 = BigAddition(Nbd & Total & String(i, "0"), Mid$(Total2, 1))
Next i
BigMultiplication = Zero(Mid$(Total2, 1))
End Function
' ADDITION
' ********
Public Function BigAddition(Term1 As String, Term2 As String)
Dim Nbd, Nbt, Nbu As Integer
St1 = Len(Term1): St2 = Len(Term2)
If St1 < St2 Then Term1 = String(St2 - St1, "0") & Term1
If St1 > St2 Then Term2 = String(St1 - St2, "0") & Term2
For i = 0 To Len(Term1) - 1
Nb1 = Mid$(Term1, Len(Term1) - i, 1)
Nb2 = Mid$(Term2, Len(Term2) - i, 1)
Nbt = Val(Nb1) + Val(Nb2) + Nbd
Nbd = Nbt \ 10
Nbu = Nbt Mod 10
Total = Nbu & Total
Next i
BigAddition = Zero(Mid$(Nbd & Total, 1))
End Function
' DIVISION
' ********
Public Function BigDivision(Term1 As String, Term2 As String, Rest As Boolean)
Total = "0"
Do While Len(Term1) > Len(Term2)
Nbz = Len(Term1) - Len(Term2) - 1
Nbr1 = Term2 & String(Nbz, "0")
Term1 = BigSoustraction(Term1, Mid$(Nbr1, 1))
Total = BigAddition(Mid$(Total, 1), "1" & String(Nbz, "0"))
Loop
For i = 1 To 20
If Term1 = Term2 Then
Total = BigAddition(Mid$(Total, 1), "1")
Reste = "0"
Exit For
ElseIf Pgdd(Term1, Term2) = 2 Then
Reste = Term1
Exit For
ElseIf Pgdd(Term1, Term2) = 1 Then
Term1 = BigSoustraction(Term1, Term2)
Total = BigAddition(Mid$(Total, 1), "1")
End If
Next i
If Rest = True Then Total = Total & "r" & Reste
BigDivision = Zero(Mid$(Total, 1))
End Function
' SOUSTRACTION
' ************
Public Function BigSoustraction(Term1 As String, Term2 As String)
Dim Nbd, Nbt, Nbu As Integer
If Pgdd(Term1, Term2) = 0 Then
BigSoustraction = "0"
Exit Function
End If
If Pgdd(Term1, Term2) = 2 Then
BigSoustraction = "-" & BigSoustraction(Term2, Term1)
Exit Function
End If
St1 = Len(Term1): St2 = Len(Term2)
If St1 < St2 Then Term1 = String(St2 - St1, "0") & Term1
If St1 > St2 Then Term2 = String(St1 - St2, "0") & Term2
For i = 0 To Len(Term1) - 1
Nb1 = Mid$(Term1, Len(Term1) - i, 1)
Nb2 = Mid$(Term2, Len(Term2) - i, 1)
If Val(Nb1) - Val(Nb2) - Nbd2 < 0 Then
Nbd = Abs(Nb1 - Nb2) \ 10 + 1
Nb1 = Val(Nb1) + Nbd * 10
End If
Nbu = Nb1 - Nb2 - Nbd2
Nbd2 = Nbd: Nbd = 0
Total = Nbu & Total
Next i
BigSoustraction = Zero(Mid$(Total, 1))
End Function
' CONVERSION BINAIRE
' ******************
Private Function DecToBin(Nombre As String)
Do While Nombre <> "0"
Bini = Val(Right(Nombre, 1)) Mod 2
Biny = Bini & Biny
Nombre = BigDivision(Nombre, "2", False)
Loop
DecToBin = Biny
End Function
' PLUS GRAND DENOMINATEUR COMMUN
' ******************************
Private Function Pgdd(Term1 As String, Term2 As String)
St1 = Len(Term1): St2 = Len(Term2)
If St1 > St2 Then Pgdd = 1: Exit Function
If St1 < St2 Then Pgdd = 2: Exit Function
For i = 1 To Len(Term1)
If Mid(Term1, i, 1) > Mid(Term2, i, 1) Then
Pgdd = 1
Exit Function
End If
If Mid(Term1, i, 1) < Mid(Term2, i, 1) Then
Pgdd = 2
Exit Function
End If
Next i
Pgdd = 0
End Function
' SUPPRESSION DU ZERO
' *******************
Private Function Zero(Term1 As String)
For i = 1 To Len(Term1) - 1
If Mid$(Term1, 1, 1) = "0" Then Term1 = Mid$(Term1, 2) Else Exit For
Next i
Zero = Term1
End Function
Je vous remercie beaucoup de votre aide
Bonne journée
Operations sur les tres grands nombres
-
andrebernard
- Messages : 58
- Inscription : jeu. 22/déc./2005 11:23
-
andrebernard
- Messages : 58
- Inscription : jeu. 22/déc./2005 11:23