begin process at 2008 07 06 03:01:05
1 205 441 membres
21 nouveaux aujourd'hui
14 119 membres club

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

Catégorie :Maths Classé sous : addittion, multiplication, soustraction, grands nombres, big numbers Niveau : Initié Date de création : 12/09/2007 Date de mise à jour : 22/01/2008 14:08:23 Vu : 4 983

Note :
Aucune note

Commentaire sur cette source (5)
Ajouter un commentaire et/ou une note

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
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
  • signaler à un administrateur
    Commentaire de MadM@tt le 12/09/2007 12:46:43

    Pour la division je crois qu'il faut que tu regarde du coté de l'opérateur mod (modulo). Enfin son fonctionnement quoi.
    Sinon si tu veux un algorithme tu as celui de la division euclidienne (celle qu'on faisait à l'école primaire).

  • signaler à un administrateur
    Commentaire de Renfield le 13/09/2007 00:03:42 administrateur CS

    plein de sources similaires dans le coin, y'a surement la réponse

  • signaler à un administrateur
    Commentaire de rambc le 16/09/2007 12:43:54

    L'algorithme de Karatsuba est une méthode simple et rapide pour la mutiplication : http://fr.wikipedia.org/wiki/Algorithme_de_Karatsuba.

    Pour la division, c'est plus compliqué car la méthode scolaire peut être assez lente sur de grands nombres. Regardes ici par exemple : http://tima-cmp.imag.fr/~guyot/Cours/Arithmetique/pdffile/divis.pdf.

  • signaler à un administrateur
    Commentaire de Amghid2007 le 25/10/2007 21:38:31

    salut...
            chapeau !!!..j'avais l'idé depuis longtemps..mais pour la division c un peu compliqué
           j'ai utiliser vos fonctions ça marche mais il y a un bug
    99999999999999999999999999999999999999+1= 0  je ne sais pas pourquoi
    dans l'ensemble ça marche a mervielle..
    amghid l'amateur

  • signaler à un administrateur
    Commentaire de ecarbill le 22/01/2008 14:03:48

    Merci à Amghid2007 pour son commentaire. Je pense que j'ai trouvé l'origine du bug. En fait il se pose 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 boocle DO While i<n  le code suivant:
    If (r > 9) Then Addition = "1" & Addition

Ajouter un commentaire

Pub



Appels d'offres

Plugin Dialer outlook
Budget : 2 000€
Travail graphique- ill...
Budget : 1 000€
creation de marque et ...
Budget : 1 000€

CalendriCode

Juillet 2008
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Boutique

Boutique de goodies CodeS-SourceS