begin process at 2010 02 10 06:31:22
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths

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

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


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
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 :9 565

Auteur : MoiDebutantVB

Ecrire un message privé
Site perso
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

 Sources du même auteur

Source .NET (Dotnet) PROMPTEUR POUR PERMETTRE DE LIRE UN TEXTE QUI AVEC DÉFILEMEN...
Source avec une capture Source .NET (Dotnet) ASTUCE : FORM NON CARRE A PARTIR D'UNE IMAGE !!! (EH OUI C'E...

 Sources de la même categorie

Source avec Zip Source .NET (Dotnet) PISH2010-VB2008 par SaintMaur
Source avec Zip Source avec une capture PI-SH-2010-VB6 par SaintMaur
ET... PI... par us_30
Source avec Zip Source avec une capture CHIFFRAGE ET DECHIFFRAGE FONCTION AFFINE par tresorsdevie
NB PREMIER : TEST DE FERMAT ET DE MILLER-RABIN par us_30

 Sources en rapport avec celle ci

Source .NET (Dotnet) CONJECTURE DE GOLDBACH par Skanenruf
Source .NET (Dotnet) CONJECTURE DE SYRACUSE par Skanenruf
Source avec Zip Source .NET (Dotnet) NOMBRES ALEATOIRE AVEC LA METHODE RANDOM par amsdiop
Source avec Zip SIMULATEUR PHYSIQUE FINALZ par Neron2005
Source avec Zip Source .NET (Dotnet) EQUATION DU SECOND DEGRÉ RÉSOLUE AVEC DEUX METHODES par amsdiop

Commentaires et avis

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é ^^

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

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

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.

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.

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 ?

++

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.

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 ?

++

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.

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

++

Commentaire de lemoutonfou1 le 08/03/2007 21:50:59

oui mais pour avoir 200 chiffres commen fait-on?

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...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,811 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales