[VB.NET] Multiplication à la russe

Voir le sujet précédent Voir le sujet suivant Aller en bas

[VB.NET] Multiplication à la russe

Message par Skynyrd777 le Mar 3 Aoû 2010 - 19:19

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
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é).
avatar
Skynyrd777
Admin

Messages : 216
Date d'inscription : 02/06/2010

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum