IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Convertir un nombre Base 10 en Base 6


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Février 2013
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Février 2013
    Messages : 43
    Par défaut Convertir un nombre Base 10 en Base 6
    Bonjour,

    Je cherche à savoir comment convertir un nombre qui est formater en Base 10 en Base 6, mais apparemment Visual Basic a une commande qui le permet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TextBox1.Text = Convert.ToString(Integer.Parse(TextBox2.Text), 3)
    Mais Voilà cette commande ne prend pas en charge la Base 6, donc je cherche toujours un moyen de convertir un nombre formater en base 10 en base 6

    Voilà merci d'avance

  2. #2
    Membre Expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Par défaut
    Salut,

    Ce ne serait pas un exercice ? Le but serait alors justement de le coder soi-même.
    En tout cas une telle fonction n'existe pas à ma connaissance.

  3. #3
    Membre averti
    Inscrit en
    Février 2013
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Février 2013
    Messages : 43
    Par défaut
    Ouais je pense que je vais devoir le coder sans commande pour m'épauler ^^

  4. #4
    Membre Expert
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Par défaut
    Convert.ToString ne permet le changement de base que pour celles les plus classiques (2, 8, 10 et 16) et renvoie une chaine (obligatoire pour la base 16) du coup obligé de le faire soi-même
    Dans ton cas tu convertis vers une base inférieure à 10 (autrement dit "l'alphabet" [les chiffres nécessaires] est déjà existant [les chiffres de 0 à 5]) du coup tu peux très bien faire une méthode qui renvoie également un nombre (plutôt qu'une chaine)
    Et si tu dois faire l'opération inverse cette même méthode pourra servir (exemple tu passes de la base 10 à la base 6 avec result = ChangeBase (nombre, 10, 6) et fais l'opération inverse avec result2 = ChangeBase (result, 6, 10) [avec nombre et result2 égaux au final])

    Sans donner trop d'infos pour te laisser chercher (dans un premier temps) une méthode qui peut t'être utile est Math.DivRem

  5. #5
    Membre averti
    Inscrit en
    Février 2013
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Février 2013
    Messages : 43
    Par défaut
    Déjà ce que je sais, c'est que pour convertir de la base 10 à la base 6, il faut à chaque fois qu'on compte 5 on ajoute 10
    Par exemple (Base 10 / Base 6) : 1 / 1, 2 / 2, 3 / 3, 4 / 4, 5 / 5, 6/10

    Mais après je sèche ^^

  6. #6
    Membre Expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Par défaut
    Pour voir comment écrire en base 6 tu peux t'aider de la méthode pour écrire en base 10 (écrire au sens informatique) :

    * Pour écrire le premier digit tu vas prendre le reste de la division euclidienne par 10, ex. :
    123 %10 = 3 -> tu peux écrire '3' pour le premier digit.
    * pour passer au digit suivant on retranche le reste trouvé précédemment à notre nombre, puis on le diviser par 10, et à nouveau appliqué ce module 10 :
    123 -3 = 120, 120 /10 = 12, 12 %3 = 2 -> tu peux écrire '2' pour le deuxième digit.
    * et ainsi de suite jusqu'à ce qu'on ait consommé tout notre nombre d'origine.

    Maintenant tu transposes le procédé pour la base 6 et tu as ton algo.
    J'ai fait un petit test de code (en C) et le principe semble fonctionné comme voulu.

  7. #7
    Membre averti
    Inscrit en
    Février 2013
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Février 2013
    Messages : 43
    Par défaut
    jopopmk
    Pour voir comment écrire en base 6 tu peux t'aider de la méthode pour écrire en base 10 (écrire au sens informatique) :

    * Pour écrire le premier digit tu vas prendre le reste de la division euclidienne par 10, ex. :
    123 %10 = 3 -> tu peux écrire '3' pour le premier digit.
    * pour passer au digit suivant on retranche le reste trouvé précédemment à notre nombre, puis on le diviser par 10, et à nouveau appliqué ce module 10 :
    123 -3 = 120, 120 /10 = 12, 12 %3 = 2 -> tu peux écrire '2' pour le deuxième digit.
    * et ainsi de suite jusqu'à ce qu'on ait consommé tout notre nombre d'origine.

    Maintenant tu transposes le procédé pour la base 6 et tu as ton algo.
    J'ai fait un petit test de code (en C) et le principe semble fonctionné comme voulu.
    Déjà merci pour m'avoir apporté plus de précision sur le sujet, mais je ne comprend pas le "jusqu'à ce qu'on ait consommé tout notre nombre d'origine."
    Cette méthode marche pour tout les nombres voulues ?

  8. #8
    Membre Expert
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Par défaut
    Reprenons ce qu'est un nombre dans une base quelconque n
    Un nombre est constitué de chiffres (il y a n chiffres différents dans une base n).
    Un nombre est constitué d'unités, de dizaines de centaines etc. toute représentées par un chiffre.Lorsque un chiffre dépasse le dernier chiffre de notre base et on augmente le "cran supérieur" (les dizaines par exemple) au chiffre suivant de son état actuel et on repart du premier chiffre dans le "cran actuel" (les unités ici).

    Voilà avec tout ça on peut écrire un nombre dans n'importe quelle base (même très exotique genre la base constitué des chiffres "toto" et "tata")

    un exemple très mécanique avec une base connue, la base 10 ; si je veux représenter une quantité en base 10 par exemple 14 je parcours les chiffres de cette base et à chaque "cran" je décrémente ma quantité j'ai donc
    quantité unités dizaines
    14 0 0
    13 1 0
    12 2 0
    11 3 0
    10 4 0
    9 5 0
    8 6 0
    7 7 0
    6 8 0
    5 9 0
    Là on arrive au passage au "cran supérieur" (on pourrait aussi appeler ça une retenue), on applique simplement ce qui a été dit et on continue
    4 0 1
    3 1 1
    2 2 1
    1 3 1
    0 4 1
    Et là heureusement on retombe bien sur notre nombre en base 10 qui a 1 dizaine et 4 unités soit 14.

    Maintenant on refais exactement la même chose mais en base 6 :
    quantité unités dizaines
    14 0 0
    13 1 0
    12 2 0
    11 3 0
    10 4 0
    9 5 0 X
    8 0 1
    7 1 1
    6 2 1
    5 3 1
    4 4 1
    3 5 1 X
    2 0 2
    1 1 2
    0 2 2
    J'ai marqué d'un X les passages de crans.

    Ce que l'on peut constater c'est que dans le cas de la base 10 on fait une retenue tous les 10 chiffres et en base 6 tous les 6 chiffres.

    Je sais que c'est un peu une évidence d'écrire cela vu qu'une base n a n chiffres

    La conséquence de cela c'est qu'on peut automatiser le processus que j'ai réalisé avec mes tableaux (même si on pourrait très bien faire un algorithme qui fonctionne aussi avec cette méthode).
    Si on fait la division euclidienne (donc avec quotient et reste) de notre quantité par notre base nous obtenons donc son nombre d'unités (le reste) et son total de dizaines (le quotient)
    avec 14 pour la base 10 on a bien reste = 4 et quotient = 1 et avec la base 6 on a reste = 2 et quotient = 2

    Maintenant pour une quantité plus grande, 1234 par exemple si on fait la même chose on a :
    division de 1234 par 10: reste = 4 et quotient = 123 (il y a 123 dizaines dans 1234)
    on a donc notre chiffre des unités (4) mais la quantité de dizaines n'est pas un chiffre de notre base il nous faut donc répéter le processus
    division de 123 par 10: reste = 3 et quotient = 12
    on a maintenant notre chiffre des dizaines (3) mais la quantité de centaines (12) n'est toujours pas un chiffre on continue donc
    division de 12 par 10: reste = 2 et quotient = 1
    on a notre chiffre des centaines (2) et la quantité de millier (1) est un chiffre donc on a fini est notre quantité 1234 représente donc le nombre 1234 en base 10 (soit 1 millier 2 centaines 3 dizaines et 4 unités)

    En appliquant la même méthodologie en utilisant la base 6 on aurait le nombre représentant la quantité 1234 en base 6 (5414)

    on a donc un algorithme qui dit (en français) tant que notre quantité n'est pas représentable par un chiffre de notre base ; on fait la division euclidienne de cette quantité par la base on garde le reste, et on recommence avec le quotient (le quotient devient la nouvelle quantité)

    si arrivé aux milliers j'avais continué que ce serait-il passé ?
    (...)
    division de 12 par 10: reste = 2 et quotient = 1
    on a notre chiffre des centaines (2) et la on répète le processus avec le quotient (1)
    division de 1 par 10: reste = 1 et quotient = 0
    on a notre chiffre des milliers (1) et le quotient vaut 0 on a consommé toute la quantité initiale (pour faire le lien avec le post de jopopmk)

    Un autre algorithme possible est donc (toujours en français) tant que notre quantité est non nulle (non entièrement consommée) ; on fait la division euclidienne de cette quantité par la base on garde le reste, et on recommence avec le quotient (le quotient devient la nouvelle quantité)

    Une "difficulté" possible risque d'être que l'on va obtenir les chiffres en ordre inverse de la manière dont on les écrit (d'abord les unités puis les dizaines etc.)
    mais si on fait attention on constate que
    au 1er "niveau" on cherche les unités (donc un truc qui aura la forme X, exemple 4 [= 4 x 1])
    au 2ème "niveau" on cherche les dizaines (donc un truc qui aura la forme X., exemple 40 [= 4 x 10])
    au 3ème "niveau" on cherche les centaines (donc un truc qui aura la forme X.., exemple 400 [= 4 x 100 = 4 x 10 x 10])
    etc.

    Si on arrivait à trouver un lien (une formule) qui lit le "niveau" (1, 2, 3) au "multiplicateur" (1, 10, 100 [ou 10 * 10]) ça serait sûrement utile

    J'ai à peu près fait le tour ; en donnant le plus d'infos sans trop dévoiler la solution, j'espère que ça sera pas trop confus

  9. #9
    Membre averti
    Inscrit en
    Février 2013
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Février 2013
    Messages : 43
    Par défaut
    Merci infiniment pour tout vos conseils, j'ai enfin réussis à m'en coder un ^^
    Résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    Public Class Form1
        Public Function convertToBase(ByVal value As Int32, base As Int32) As String
     
            Dim chars As String = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
            Dim r As Int32
            Dim newNumber As String
     
            If (base < 2 Or base > chars.Length) Then
                Return ""
            End If
     
            newNumber = ""
     
            While value >= base
                r = value Mod base
                newNumber = chars.Substring(r, 1) & newNumber
                value = Convert.ToInt32(Math.Floor(value / base))
            End While
            If value > 0 Then
                newNumber = chars.Substring(value, 1) & newNumber
            End If
     
            If String.IsNullOrEmpty(newNumber) Then
                newNumber = "0"
            End If
     
            r = Nothing
            chars = Nothing
     
            Return newNumber
     
        End Function
     
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            TextBox3.Text = convertToBase(TextBox1.Text, 6)
            TextBox4.Text = convertToBase(TextBox2.Text, 6)
        End Sub
    End Class
    Je vous remercie tous mille fois ^^

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Convertir un nombre décimal fractionnaire négatif en base 2
    Par christian79 dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 09/04/2013, 13h55
  2. Réponses: 15
    Dernier message: 14/03/2012, 15h12
  3. [VB.net] Convertir Base de données .mdb en fichier Texte
    Par hunteshiva dans le forum VB.NET
    Réponses: 5
    Dernier message: 27/05/2010, 14h04
  4. Réponses: 8
    Dernier message: 18/05/2010, 09h33
  5. [VB.Net] Convertir un nombre au format double en date
    Par Immobilis dans le forum ASP.NET
    Réponses: 6
    Dernier message: 14/11/2005, 15h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo