[VB.NET] Multiplication à la russe
Republic of Computing - Forum :: Programmation :: Programmation algorithmique :: Banque d'algorithmes
Page 1 sur 1
[VB.NET] Multiplication à la russe
Bonjour,
De tout temps de nombreuses méthodes pour effectuer des multiplications ont étés développées. Les plus générales ne sont pas applicables graphiquement et reposent sur une série d'opérations élémentaires (addition, soustraction, multiplication) entre des chiffres (nombres à un digit). La méthode "à la russe" consiste à mettre face à face les deux entiers naturels à multiplier. On effectuera une suite de divisions euclidiennes par deux (sans tenir compte du reste) sur le premier nombre (cela revient à diviser et à prendre uniquement la partie entière du résultat). Sur le deuxième naturel, on multipliera par deux ; on arrange les suites de façon à mettre en colonnes face à face chaque résultat (cf. schéma ci dessous). L'étape suivante sera de barrée les nombres de la deuxième colonne se trouvant en face de nombres paires dans la première colonne. Le résultat global de la multiplication se trouve être la somme des nombres non-barrés de la seconde colonne (le premier nombre compris).
Algorithme en VB.NET
Notes : Pour "barrer" un nombre on assigne zéro à la variable le représentant, ça permet de ne pas en tenir compte dans la somme arithmétique finale. Le cas de la multiplication par zéro étant géré théoriquement par la multiplication à la russe doit être ajouté de façon spécifique pour éviter une boucle infinie (en l'occurrence un dépassement de capacité).
De tout temps de nombreuses méthodes pour effectuer des multiplications ont étés développées. Les plus générales ne sont pas applicables graphiquement et reposent sur une série d'opérations élémentaires (addition, soustraction, multiplication) entre des chiffres (nombres à un digit). La méthode "à la russe" consiste à mettre face à face les deux entiers naturels à multiplier. On effectuera une suite de divisions euclidiennes par deux (sans tenir compte du reste) sur le premier nombre (cela revient à diviser et à prendre uniquement la partie entière du résultat). Sur le deuxième naturel, on multipliera par deux ; on arrange les suites de façon à mettre en colonnes face à face chaque résultat (cf. schéma ci dessous). L'étape suivante sera de barrée les nombres de la deuxième colonne se trouvant en face de nombres paires dans la première colonne. Le résultat global de la multiplication se trouve être la somme des nombres non-barrés de la seconde colonne (le premier nombre compris).
Algorithme en VB.NET
- Code:
Sub Main()
' Déclaration et assignation des naturels
Dim a As UInteger, b As UInteger
Console.Out.WriteLine("a=") : a = Console.In.ReadLine()
Console.Out.WriteLine("b=") : b = Console.In.ReadLine()
Dim atmp As UInteger = a, btmp As UInteger = b
If a = 0 Or b = 0 Then Console.Out.WriteLine(a & "*" & b & "=0") ' cas trivial
' Premier opérande
Dim t1() As UInteger, t1p As UShort = 0
While atmp <> 1
t1p += 1
ReDim Preserve t1(t1p)
t1(t1p) = Int(atmp / 2)
atmp = Int(atmp / 2)
End While
' Deuxième opérande
Dim t2(t1p) As UInteger
For t2p As UShort = 1 To t1p
t2(t2p) = btmp * 2
btmp *= 2
Next t2p
' Somme itérative
Dim res As UInteger
If Not (a And 1) = 1 Then
res = 0
Else
res = b
End If
For t3p As UShort = 1 To t1p
If Not (t1(t3p) And 1) = 1 Then t2(t3p) = 0
res += t2(t3p)
Next t3p
' Affichage du résultat
Console.Out.WriteLine(a & "*" & b & "=" & res)
Console.In.ReadLine()
End Sub
Notes : Pour "barrer" un nombre on assigne zéro à la variable le représentant, ça permet de ne pas en tenir compte dans la somme arithmétique finale. Le cas de la multiplication par zéro étant géré théoriquement par la multiplication à la russe doit être ajouté de façon spécifique pour éviter une boucle infinie (en l'occurrence un dépassement de capacité).
Skynyrd777- Admin
- Messages : 216
Date d'inscription : 02/06/2010
Republic of Computing - Forum :: Programmation :: Programmation algorithmique :: Banque d'algorithmes
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum