Trouver une ressource (Nouvelle version du moteur, plus rapide & pertinent, essayez le !)
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
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 de la même categorie
Commentaires
Discussions en rapport avec ce code source
|
Téléchargements
Logiciels à télécharger sur le même thème :
|