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 !

ADDITIONNER, SOUSTRAIRE ET MULTIPLIER DEUX NOMBRES, EN ÉVITANT LE DÉPASSEMENT DE CAPACITÉ.


Information sur la source

Catégorie :Maths Source .NET ( DotNet ) Classé sous : addition, ajouter, plus, maths, byte Niveau : Initié Date de création : 13/12/2006 Date de mise à jour : 03/03/2007 09:03:22 Vu : 8 944

Note :
10 / 10 - par 1 personne
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

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

Description

Ce code permet d'additionner deux nombres, quel que soit leur nombre de chiffres. Il de basse sur la méthode usuelle d'addition, soit un tableau dans lequel les nombres sont additionnées par colonne.
 

Source

  • Public Function Addition(ByVal nbr1 As String, ByVal nbr2 As String)
  • Dim FinalChiffresCount As Long = IIf(nbr1.Length > nbr2.Length, nbr1.Length, nbr2.Length)
  • Dim Operation_table(FinalChiffresCount, 2) As Byte
  • Dim Length As Byte
  • Dim result As String
  • Length = nbr1.Length
  • For i As Byte = 0 To Length - 1
  • Operation_table(i, 0) = nbr1.Substring(Length - i - 1, 1)
  • Next
  • Length = nbr2.Length
  • For i As Byte = 0 To Length - 1
  • Operation_table(i, 1) = nbr2.Substring(Length - i - 1, 1)
  • Next
  • For i As Byte = 0 To FinalChiffresCount 'le iif extrait la + grande longueur, puis on rajoute un pour par exemple 600+700=1300, soit quatre chiffres au lieu de 3
  • Operation_table(i, 2) += Operation_table(i, 0) + Operation_table(i, 1)
  • If Operation_table(i, 2).ToString.Length > 1 Then
  • Operation_table(i + 1, 2) += Operation_table(i, 2).ToString.Substring(0, 1)
  • Operation_table(i, 2) = Operation_table(i, 2).ToString.Substring(1, 1)
  • End If
  • Next
  • result = ""
  • For i As Integer = FinalChiffresCount To 0 Step -1
  • result &= Operation_table(i, 2)
  • Next
  • Do Until result.Substring(0, 1) <> "0"
  • result = result.Remove(0, 1)
  • Loop
  • Return result
  • End Function
  • 'Soustraction
  • Public Function Soustraction(ByVal nbr1 As String, ByVal nbr2 As String)
  • Dim FinalChiffresCount As Long = IIf(nbr1.Length > nbr2.Length, nbr1.Length, nbr2.Length) 'le iif extrait le nombre ayant le + de chiffres pour connaitre la largeur nécessaire du tableau...
  • Dim Operation_table(FinalChiffresCount, 2) As Long
  • Dim Length As Long
  • Dim result As String
  • Length = nbr1.Length
  • For i As Long = 0 To Length - 1
  • Operation_table(i, 0) = nbr1.Substring(Length - i - 1, 1)
  • Next
  • Length = nbr2.Length
  • For i As Long = 0 To Length - 1
  • Operation_table(i, 1) = nbr2.Substring(Length - i - 1, 1)
  • Next
  • For i As Long = 0 To (FinalChiffresCount - 1)
  • If Operation_table(i, 0) < Operation_table(i, 1) Then 'ici on vérifie d'abord, au contraire de l'addition, que le chiffre auquel on soustrait est > au chiffre qu'on soustrait. Ainsi, si ce n'est pas le cas, enlève t'on une dizaine (dans la case suivante au niveau du nombre soustrait) et en rajoute t'on une dans la case actuelle (au niveau du nombre aquel on soustrait).
  • Operation_table(i, 0) += 10
  • Operation_table(i + 1, 1) += 1
  • End If
  • Operation_table(i, 2) = Operation_table(i, 0) - Operation_table(i, 1)
  • Next
  • result = ""
  • For i As Integer = FinalChiffresCount To 0 Step -1
  • result &= Operation_table(i, 2)
  • Next
  • Do Until result.Substring(0, 1) <> "0"
  • result.Remove(0, 1)
  • Loop
  • Return result
  • End Function
  • 'Multiplication
  • Public Function Multiplication(ByVal nbr1 As String, ByVal nbr2 As String, ByVal Sender As Grandsnombres)
  • Dim result As String = "0"
  • Dim Tours As String = "0"
  • Do Until Tours = nbr2
  • result = Addition(nbr1, result)
  • Tours = Addition(Tours, 1)
  • Application.DoEvents()
  • Sender.Statut.Text = "opération " & Tours & "/" & nbr2
  • Loop
  • Return result
  • End Function
    Public Function Addition(ByVal nbr1 As String, ByVal nbr2 As String)
        Dim FinalChiffresCount As Long = IIf(nbr1.Length > nbr2.Length, nbr1.Length, nbr2.Length)
        Dim Operation_table(FinalChiffresCount, 2) As Byte
        Dim Length As Byte
        Dim result As String

        Length = nbr1.Length
        For i As Byte = 0 To Length - 1
            Operation_table(i, 0) = nbr1.Substring(Length - i - 1, 1)
        Next
        Length = nbr2.Length
        For i As Byte = 0 To Length - 1
            Operation_table(i, 1) = nbr2.Substring(Length - i - 1, 1)
        Next

        For i As Byte = 0 To FinalChiffresCount 'le iif extrait la + grande longueur, puis on rajoute un pour par exemple 600+700=1300, soit quatre chiffres au lieu de 3
            Operation_table(i, 2) += Operation_table(i, 0) + Operation_table(i, 1)
            If Operation_table(i, 2).ToString.Length > 1 Then
                Operation_table(i + 1, 2) += Operation_table(i, 2).ToString.Substring(0, 1)
                Operation_table(i, 2) = Operation_table(i, 2).ToString.Substring(1, 1)
            End If
        Next

        result = ""
        For i As Integer = FinalChiffresCount To 0 Step -1
            result &= Operation_table(i, 2)
        Next

        Do Until result.Substring(0, 1) <> "0"
            result = result.Remove(0, 1)
        Loop
        Return result
    End Function

'Soustraction
    Public Function Soustraction(ByVal nbr1 As String, ByVal nbr2 As String)
        Dim FinalChiffresCount As Long = IIf(nbr1.Length > nbr2.Length, nbr1.Length, nbr2.Length) 'le iif extrait le nombre ayant le + de chiffres pour connaitre la largeur nécessaire du tableau...
        Dim Operation_table(FinalChiffresCount, 2) As Long
        Dim Length As Long
        Dim result As String

        Length = nbr1.Length
        For i As Long = 0 To Length - 1
            Operation_table(i, 0) = nbr1.Substring(Length - i - 1, 1)
        Next
        Length = nbr2.Length
        For i As Long = 0 To Length - 1
            Operation_table(i, 1) = nbr2.Substring(Length - i - 1, 1)
        Next

        For i As Long = 0 To (FinalChiffresCount - 1)
            If Operation_table(i, 0) < Operation_table(i, 1) Then 'ici on vérifie d'abord, au contraire de l'addition, que le chiffre auquel on soustrait est > au chiffre qu'on soustrait. Ainsi, si ce n'est pas le cas, enlève t'on une dizaine (dans la case suivante au niveau du nombre soustrait) et en rajoute t'on une dans la case actuelle (au niveau du nombre aquel on soustrait).
                Operation_table(i, 0) += 10
                Operation_table(i + 1, 1) += 1
            End If
            Operation_table(i, 2) = Operation_table(i, 0) - Operation_table(i, 1)
        Next

        result = ""
        For i As Integer = FinalChiffresCount To 0 Step -1
            result &= Operation_table(i, 2)
        Next

        Do Until result.Substring(0, 1) <> "0"
            result.Remove(0, 1)
        Loop
        Return result
    End Function

'Multiplication
    Public Function Multiplication(ByVal nbr1 As String, ByVal nbr2 As String, ByVal Sender As Grandsnombres)
        Dim result As String = "0"
        Dim Tours As String = "0"
        Do Until Tours = nbr2
            result = Addition(nbr1, result)
            Tours = Addition(Tours, 1)
            Application.DoEvents()
            Sender.Statut.Text = "opération " & Tours & "/" & nbr2
        Loop
        Return result
    End Function

Conclusion

Je ne vois pas de bug particulier, sinon que la déclaration du tableau en byte limite le nombre de chiffres à 256, mais il suffit de le changer en long pour obtenir un nombre maximum de 2 milliards de chiffres environ, ce qui est plus que raisonnable.
Le classement en niveau deux vient du fait que l'utilisation des tableaux est des fois malaisée, et que ma source, manquant de commentaires, est peut-être difficile à lire.

Le code fonctionne ainsi :
On déclare un tableau à trois lignes.
On écrit les deux termes, en les lisant de droite à gauche, dans le tableau, avec un chiffre, par case et une ligne par terme.
On additionne colonne par colonne et, si le résultat de l'addition de 2 chiffres est > à 9, alors on écrit la dizaine dans la case suivante.
Finalement on inverse le sens de lecture du chiffre.

 

Historique

13 décembre 2006 16:02:48 :
Correction d'ue erreur mineure
13 décembre 2006 16:17:35 :
Ajout de la suppression des 0 éventuels à gauche du nombre.
03 mars 2007 09:03:23 :
Ajout de la soustraction et de la multiplication

Commentaires et avis

signaler à un administrateur
Commentaire de hvb le 13/12/2006 20:55:55

un long en .net c'est codé sur 16 octets, donc max FFFFFFFFFFFFFFFF nan? (ça fait bien plus que 2 milliard : 18446744073709551615)
desolé de m'arreter là dessus et non sur la source, mais ça m'a interpelé ^^

signaler à un administrateur
Commentaire de BruNews le 13/12/2006 21:03:14 administrateur CS

sur 16 octets ???
peut-etre sur Itanium...

signaler à un administrateur
Commentaire de hvb le 13/12/2006 21:49:30

effectivement, 8 octets et pas 16, je sais pas ou j'ai été cherché cette idiotie, autant pour moi ^^'
cependant cela retourne tout de meme FFFFFFFFFFFFFFFF, c'est seulement en vb6 (en antérieurs) que les long sont codés sur 4 octets, et donc environ égaux à 2 milliards.

signaler à un administrateur
Commentaire de MoiDebutantVB le 15/12/2006 22:29:09

Correction :
"Les variables Long sont stockées sous la forme d'entiers 64 bits (8 octets) signés dont les valeurs sont comprises entre -9 223 372 036 854 775 808 et 9 223 372 036 854 775 807" : MSDN library

Cependant, au niveau (par exemple, dans la suite de Fibonacci, le 39150ème terme a 8183 chiffres. Mais le .net framework s'arrete au 92ème terme...) de nombres très importants, ca devient insuffisant.

signaler à un administrateur
Commentaire de draluorg le 19/12/2006 18:10:31

Salut a tous,

Eh en .net on travail plutot avec des Int16(2 octect) Int32(4 octet) et int64(8 octect) non ?

Le type long n'est il pas egal a un Int32 sur un OS 32bits et un Int64 sur un OS 64Bits ?

++

signaler à un administrateur
Commentaire de BruNews le 19/12/2006 19:30:21 administrateur CS

Sans faire de .net je pense et j'espère que non, ce serait le souk pour la conception d'un algo.
C'est le langage qui détermine la longueur d'une variable, idem en C ou 'long' comme 'int' restent 4 octets même en compil 64.

signaler à un administrateur
Commentaire de draluorg le 19/12/2006 19:39:34

Salut BruNews,

Je partage tout a fait ton point de vue, le truc c'est que j'avais justement eu des erreurs lorsque j'avais compiler sous X64 et que j'ai executer sous Win32, j'ai passé mes long en int32 et plus d'erreur, j'ai fais tres peu de .net et j'ai pas regarde plus loin donc j'ai conclu surement trop vite que c'etait du au type long code sous 8 octet a la place de 4...

Mais quelle est la différence alors entre Int32 et un long ?

++

signaler à un administrateur
Commentaire de BruNews le 19/12/2006 20:00:58 administrateur CS

Pour .net, int32 est 32 bits comme son nom l'indique et Long est 64 comme dit plus haut.

signaler à un administrateur
Commentaire de draluorg le 19/12/2006 23:37:11

Ok merci

En effet j'ai reinstaller Visual Studio 2005 et les Long sont bien les Int64 sans doutes que mon probleme etait que j'avais du melanger des Int32 avec des long.

Bizare quand meme ces double appelations non ?

16 bits = Short ou Int16
32 bits = Integer ou Int32
64 Bits = Long ou Int64

++

signaler à un administrateur
Commentaire de lemoutonfou1 le 08/03/2007 21:50:59

oui mais pour avoir 200 chiffres commen fait-on?

signaler à un administrateur
Commentaire de pifou25 le 20/03/2007 18:16:43

bonjour!
Je viens de comprendre l'addition et la soustraction, mais je butte sur cette multiplication qui me semble un peu simpliste: c'est quoi l'argument "ByVal Sender As Grandsnombres" ?? d'ou vient ce grandsnombres...
Et puis pour quand la division :D merci a+

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Passage d'un tableau de byte à une fonction encapsulé dans un ACtiveX Dll [ par novik ] J'aimerai pouvoir passer un tableau de Byte a ma fonction (Activex Dll)lors de l'appel j'ai une erreur Type Mismatch.Or lorsque j'appelle cette foncti script d'installation - ajout de fichiers [ par Georef ] Bonjour,lors de la génération d'un pgm d'installation, je dois ajouterde nombreux fichiers de données. La manipulation"ajouter", choix du fichier... e Comment ajouter un mot au curseur dans une texbox [ par Fagu ] Dans une texbox je voudrais ajouter un mot en cliquant sur un objet au niveau du curseur dans la texbox. Est-ce possible ? Ou bien selectionner avec l Upload de fichiers [ par Pat ] Je souhaite ajouter la fonction, upload de fichier sur mon site pour permettre aux visiteurs de poster des fichier zip.Mon site est hébergé sur un ser comment ajouter Controles internets en vb [ par Natij ] bonjour,j'aimerai avoir des infos sur l'ajout de controle internet dans un programme vb merci logicave@yahoo.fr Ajouter un nouvel enreg ds une table depuis VB. URGENt!! [ par flo ] COmment depuis Vb (Avec ADO) ajouter un enregistrement ds une table de ma bd Access?Faut il utiliser ALTER TABLE nom_table(........,....)?Merci de vot addition de 3 chiffres [ par WareG ] dans un formulaire, je doit calculer la valeur de 3 textbox dans une textbox.ce sont des chiffres.lorsque je n'ai que deux valeurs pas de problemes, m basse de donnée [ par indurain ] Salut,J'essai présentement pour la première fois à travailler avec une basse de donnée. Mon problème est que je désire faire saisir des informations e ajouter 1 colone a 1 dbGrid [ par tom ] Comment puis je ajouter une colonne dans mon dbGridla question est stupide mais tant pismerciTom Ajouter une propriété perso à un doc word [ par Ricou ] Est-ce que quelqu'un saurait comment ajouter une propriété personnalisée à un document word ?J'ai essayé avec la commande suivante mais ça ne marche p


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,702 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.