Qui n'a jamais été curieux de savoir comment faire une addittion, une soustraction, une multiplication avec des drands nombres ayant jusqu'à 200 chiffres ?
J'ai conçu ces fonctions pour le besoins d'un système de cryptage que je mettais sur place. Alors je le partage avec vous. J'attends toutes vos suggestions d'amélioration.
Un exemple d'utilisation avec :
a="1234567891011121314151617181920212223242523272829303132333435363738394041"
b="1234567891011121314151617181920212223242523272829303132333435363738394041424344454647484950515253545556575859"
La multiplication de ces deux nombres donne:
Multiplication(a,b)="1524156877515647915714744540673658430040733651926643869374389760363874548465760339953903581267217630853994489609779067085290100257651497011735453700251937161627394225799459650056219"
Soustraction(a,b)="-1234567891011121314151617181920212222007955381818181818181818181818181818181821181818181818181818181818181818"
J'ai aussi besoin de faire de meme pour la division. Alors un coup de main sera le bienvenu
Source / Exemple :
Function DeleteZeroDebut(Texte As String) As String
'Fonction utilisée pour éliminer les 0 au début d'un nombre
i = 0
DeleteZeroDebut = ""
ZeroDebut = True
Do
i = i + 1
If (Mid(Texte, i, 1) <> 0 And ZeroDebut = True) Then
ZeroDebut = False
End If
If (ZeroDebut = False) Then DeleteZeroDebut = DeleteZeroDebut & Mid(Texte, i, 1)
Loop While i < Len(Texte)
If (DeleteZeroDebut = "") Then DeleteZeroDebut = 0
End Function
Function EstSuperieur(Nombre1 As String, Nombre2 As String) As Boolean
'Fonction utiliser pour comparer deux grands nombres
'Equivalent de "Nombre1 > Nombre2"
Nombre1 = DeleteZeroDebut(Nombre1)
Nombre2 = DeleteZeroDebut(Nombre2)
EstSuperieur = True
'Rechercher le plus grand
If Len(Nombre1) < Len(Nombre2) Then 'Cas ou les deux nombres ont le meme nombre de chiffre
EstSuperieur = False
ElseIf (Len(Nombre1) = Len(Nombre2)) Then
i = 0
Do
i = i + 1
If (Mid(Nombre1, i, 1) < Mid(Nombre2, i, 1)) Then EstSuperieur = False
Loop While (i < Len(Nombre1) And EstSuperieur = True)
End If
End Function
Function Addition(Nombre1 As String, Nombre2 As String) As String
'Cette fonction sert à additionner des grands nombres
'Supprimer éventuellement les zeros en début
Nombre1 = DeleteZeroDebut(Nombre1)
Nombre2 = DeleteZeroDebut(Nombre2)
Dim Retenu
Dim Signe
Addition = ""
Signe = ""
'Rechercher le signe des nombres
If Mid(Nombre1, 1, 1) = "-" Then 'Nombre1 négatif
If Mid(Nombre2, 1, 1) = "-" Then 'Les deux nombres sont négatifs
Signe = "-"
Nombre1 = Mid(Nombre1, 2)
Nombre2 = Mid(Nombre2, 2)
Else 'Nombre1 négatif et nombre2 positif
Addition = Soustraction(Nombre2, Mid(Nombre1, 2))
Exit Function
End If
Else 'Nombre1 positif
If Mid(Nombre2, 1, 1) = "-" Then 'Nombre1 positif et Nombre2 négatif
Addition = Soustraction(Nombre1, Mid(Nombre2, 2))
Exit Function
End If
End If
If (Len(Nombre1) < Len(Nombre2)) Then
a = Nombre1
Nombre1 = Nombre2
Nombre2 = a
End If
n = Len(Nombre1)
Retenu = 0
i = 0
Do
i = i + 1
n1 = Mid(Nombre1, Len(Nombre1) - i + 1, 1)
If (i < Len(Nombre2) + 1) Then
n2 = Mid(Nombre2, Len(Nombre2) - i + 1, 1)
Else
n2 = 0
End If
r = Retenu + CInt(n1) + CInt(n2)
Addition = Right(r, 1) & Addition
If (r > 9) Then
Retenu = 1
Else
Retenu = 0
End If
Loop While i < n
If (r > 9) Then Addition = "1" & Addition
Addition = Signe & Addition
End Function
Function Soustraction(Nombre1 As String, Nombre2 As String) As String
Nombre1 = DeleteZeroDebut(Nombre1)
Nombre2 = DeleteZeroDebut(Nombre2)
Signe = ""
Soustraction = ""
Dim Resultat()
Dim Retenu
'Rechercher le signe des nombres
If Mid(Nombre1, 1, 1) = "-" Then 'Nombre1 négatif
If Mid(Nombre2, 1, 1) = "-" Then 'Les deux nombres sont négatifs
Soustraction = Soustraction(Mid(Nombre2, 2), Mid(Nombre1, 2))
Exit Function
Else 'Nombre1 négatif et nombre2 positif
Soustraction = "-" & Addition(Mid(Nombre1, 2), Nombre2)
Exit Function
End If
Else 'Nombre1 positif
If Mid(Nombre2, 1, 1) = "-" Then 'Nombre1 positif et Nombre2 négatif
Soustraction = Addition(Nombre1, Mid(Nombre2, 2))
Exit Function
End If
End If
If (Len(Nombre1) < Len(Nombre2)) Then
a = Nombre1
Nombre1 = Nombre2
Nombre2 = a
End If
'Renverser au cas ou le premier argument est inférieur
If (EstSuperieur(Nombre2, Nombre1)) Then
Signe = "-"
a = Nombre1
Nombre1 = Nombre2
Nombre2 = a
End If
ReDim Resultat(1 To Len(Nombre1))
Retenu = 0
Jeretiens = False
i = 0
Do
i = i + 1
n1 = Mid(Nombre1, Len(Nombre1) - i + 1, 1)
If (i < Len(Nombre2) + 1) Then
n2 = Mid(Nombre2, Len(Nombre2) - i + 1, 1)
Else
n2 = 0
End If
If (CInt(Retenu + n2) > CInt(n1)) Then
n1 = n1 + 10
Jeretiens = True
Else
Jeretiens = False
End If
Resultat(i) = n1 - n2 - Retenu
If (Jeretiens = True) Then
Retenu = 1
Else
Retenu = 0
End If
Loop While i < Len(Nombre1)
'Inversion du texte obtenu
i = 0
Soustraction = ""
ZeroDebut = True
Do
i = i + 1
If (Resultat(Len(Nombre1) + 1 - i) <> 0 And ZeroDebut = True) Then
ZeroDebut = False
End If
If (ZeroDebut = False) Then Soustraction = Soustraction & Resultat(Len(Nombre1) + 1 - i)
Loop While i < Len(Nombre1)
If (Soustraction = "") Then Soustraction = 0
Soustraction = Signe & Soustraction
If Soustraction = "-0" Then Soustraction = "0"
End Function
Function Multi_Chiffre(Nombre As String, chiffre As Integer) As String
' Cette fonction multiplie un nombre quelconque par un chiffre entre 0 et 9
'Cette fonction n'est que la mise en oeuvre de la procedure du calcul manuel faite à l'ecole primaire
If chiffre = 0 Then
Multi_Chiffre = "0"
Exit Function
End If
Nombre = DeleteZeroDebut(Nombre)
Dim Retenu As Integer
Dim n As Integer
Retenu = 0
Multi_Chiffre = ""
i = 0
Do
i = i + 1
n = CInt(Mid(Nombre, Len(Nombre) + 1 - i, 1)) * CInt(chiffre) + CInt(Retenu)
Multi_Chiffre = Right(n, 1) & Multi_Chiffre
Retenu = (n - (n Mod 10)) / 10
Loop While i < Len(Nombre)
If Retenu <> 0 Then Multi_Chiffre = Retenu & Multi_Chiffre
End Function
Function Multiplication(Nombre1 As String, Nombre2 As String) As String
Nombre1 = DeleteZeroDebut(Nombre1)
Nombre2 = DeleteZeroDebut(Nombre2)
'Eliminer les cas zeros
If (Nombre1 = "0" Or Nombre2 = "0" Or Nombre1 = "-0" Or Nombre2 = "-0") Then
Multiplication = "0"
Exit Function
End If
Signe = ""
'Regarder le signe
If Mid(Nombre1, 1, 1) = "-" Then 'Nombre1 négatif
Nombre1 = Mid(Nombre1, 2)
If Mid(Nombre2, 1, 1) = "-" Then 'Les deux nombres sont négatif
Nombre2 = Mid(Nombre2, 2)
Else
Signe = "-"
End If
Else 'Nombre1 positif
If Mid(Nombre2, 1, 1) = "-" Then 'Nombre1 positif et Nombre2 négatif
Signe = "-"
Nombre2 = Mid(Nombre2, 2)
End If
End If
'Enlever les zero a droites et les ajouter en fin d'opération
' cas du premier nombre
ZeroDroite = ""
Do
If Right(Nombre1, 1) = "0" Then
ZeroDroite = ZeroDroite & "0"
Nombre1 = Mid(Nombre1, 1, Len(Nombre1) - 1)
End If
Loop While Right(Nombre1, 1) = "0"
'Cas du deuxième nombre
Do
If Right(Nombre2, 1) = "0" Then
ZeroDroite = ZeroDroite & "0"
Nombre2 = Mid(Nombre2, 1, Len(Nombre2) - 1)
End If
Loop While Right(Nombre2, 1) = "0"
If (Len(Nombre1) < Len(Nombre2)) Then
a = Nombre1
Nombre1 = Nombre2
Nombre2 = a
End If
Multiplication = "0"
Retenu = ""
Dim chiffre As Integer
i = 0
Do
i = i + 1
chiffre = Mid(Nombre2, Len(Nombre2) + 1 - i, 1)
Multiple_Partiel = Multi_Chiffre(Nombre1, chiffre)
Multiplication = Addition(Multiplication, Multiple_Partiel & Retenu)
Retenu = Retenu & "0"
Loop While i < Len(Nombre2)
Multiplication = Signe & Multiplication & ZeroDroite
End Function
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.