begin process at 2008 08 30 12:30:35
1 234 003 membres
37 nouveaux aujourd'hui
14 294 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 !

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 : 7 557

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

Pub



Appels d'offres

Recherche developpeur ...
Budget : 700€
SITE MARCHAND LOCATION...
Budget : 3 000€
SITE MARCHAND POUR HOTEL
Budget : 4 000€

CalendriCode

Août 2008
LMMJVSD
    123
45678910
11121314151617
18192021222324
25262728293031

Téléchargements

Boutique

Boutique de goodies CodeS-SourceS