|
Trouver une ressource
Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !
LES OPÉRATIONS SUR LES GRANDS NOMBRES (100, 200 CHIFFRES)
Information sur la source
Description
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
- 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
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
Historique
- 22 janvier 2008 14:08:23 :
- En fait il y avait un bug dans la fonction Addition chaque fois que la somme du premier chiffre du premier nombre et celui du second nombre est supérieur à 10.
exemple (9+1) vous trouverai 0 au lieu de 10
(98+31) vous trouverai 29 au lieu de 129
Donc a chaque fois, il y a le 1 qui est enlevé. Pour corriger ce problème j'ai juste ajouter après la boucle DO While i<n le code suivant:
If (r > 9) Then Addition = "1" & Addition
Sources du même auteur
Sources de la même categorie
Sources en rapport avec celle ci
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
multiplication, additon, soustraction et division [ par Xoper ]
je chercher un code qui me permet de prend une textbox, de la multiplier par un nombre fix et de donenr le resulta dans un autre textbox, puis par la
Multiplication refusée.... [ par bil kid ]
Voila mon problème:a=(720*60)/(t*500)Ceci a lieu dans une procédure click, et a comme t sont deux variable currency. T aynat pour valeur 1.Quand le co
Multiplication dans une requete [ par oBud ]
J'ai une question surement facile mais je n'y trouve pas la reponse .J'utilise le dataenvironment dans un programme et je dois faire une data grid qui
Probleme de DLL.... [ par fred.toto ]
Bonjour,J'ai un souci au niveau d'un dll... Je m'explique.J'ai créer une dll tte simple avec 4 fonctions Addition, Soustraction, Multiplication e
soustraction de date [ par oxram ]
Bonjour j'aimerais savoir si la soustraction est possible avec les dates. (Exemple : date - 3 = 16/04/2005) avec date qui est la date du jour.Merci de
multiplication decimal heure [ par pascallac ]
bonjourj'ai trouvé une solution pour pour W1 * t1 = Wh1mais je me sers de h1 et n1 Wh1(i) = W1(i) * ((n1(i) / 60)
Problème tout bête de soustraction de Date [ par NykoKurapika ]
Salut tout le monde ! Mon problème est tout simple et pourtant .... voili, je voudrais soustraire à la date du jour une autre date conte
[VBS] Retour a un inputbox ... [ par zaert ]
Bonjour tout le monde ! Je suis en train d'elaborer un petit logiciel simpa (logiciel niveau debutant :D) et j'ai un petit probleme avec celui ci ! Vo
[VBS] [ par zaert ]
Bonjour , je veux faire un petit logiciel de revision des tables de multiplication pour mon petit cousin mais le probleme est le suivant , je vous mon
[VB6] Soustraction dans un variable [ par JeffC1977 ]
Salut...J'ai un problème avec un Soustraction... Bon je sais que je ne devrais pas avoiur de problème mais ca ne fonctionne pas...J'utilise
|
Téléchargements
Logiciels à télécharger sur le même thème :
Comparez les prix Nouvelle version
|