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

C# Discussion :

Convertir un nombre dans une "base" où le zéro n'existe pas


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut Convertir un nombre dans une "base" où le zéro n'existe pas
    Le bloc qui suit concerne une question qui n'a plus lieu d'être (et qui a trouvé sa réponse).

    Allez directement au poste 4, où j'expose mon problème pour déterminer la représentation d'un nombre décimal sous forme de lettres, à la sauce Excel (la numérotation des colonnes).

    ----------------------------------------------

    Bonjour,

    C'est plus un problème d'algo qu'autrechose... voir même de mathématique.

    Si je désire représenter le nombre "50" (base décimale) en base 8 (octale), je sais le faire de la façon suivante :

    50 % 8 = 2 ; 50 / 8 = 6
    6 % 8 = 6 ; 6 / 8 = 0
    => 62

    Je sais en même temps qu'il me faut 2 chiffres.

    Pour déterminer le nombre de chiffres, d'un point de vue algo, je vois donc comment faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int val = 50;
    int base = 8;
    int nbDigits = 0;
     
    while (val > 0)
    {
       nbDigits++;
       val /= base;
    }
    Sauf que je trouve que c'est loin d'être performant.

    En effet, il me semble qu'il existe une fonction mathématique qui permet de dire combien de fois on peut diviser un nombre par un autre, mais pas moyen de mettre la main dessus

    J'ai cru un moment que c'était la fonction puissance avec -base ou 1/base, mais ce n'est visiblement pas ça.

  2. #2
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Bonjour,

    Citation Envoyé par StringBuilder Voir le message
    C'est plus un problème d'algo qu'autrechose... voir même de mathématique.

    Pour déterminer le nombre de chiffres, d'un point de vue algo, je vois donc comment faire :
    L'élégance y perdra surement, mais pourquoi ne pas faire la conversion et compter les digits tout simplement ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                int a = 50;
                int digitCount = Convert.ToString(a, 8).Length;

  3. #3
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Ben parce qu'en fait, c'est la fonction Log() qui permet de faire ce que je cherche, et c'est plus élégant

    Surtout, je cherche à changer de base, mais en utilisant d'autres chiffres que les chiffres conventionnels.

    Par exemple, utiliser la base 26 pour compter "alphabétiquement", c'est à dire :

    A, B, C, ... Z, AA, AB, AC, ...

    Et faire une conversion va me produire un résultat contenant des chiffres + les 16 premières lettres (à compter que .NET sache convertir en base 26).

    Et du coup, il faudra que je me coltine des replaces pour mettre les bons "chiffres".

    Mais le problème est résolu avec le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int charcount = 1;
    if (number > 0)
    {
       charcount = (int)Math.Floor(Math.Log(number, 26) + 1);
    }

  4. #4
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Grmpf... Je me rends compte que c'est bien plus complexe que ça... La numérotation avec les lettres est bien plus qu'une base alternative, c'est du grand n'importe quoi inventé par un fou furieux :/

    En effet, pour que A < AA, il faut que A != 0
    Idem pour que Z < AA

    Donc on passe en base 27 et non 26 et mais le zéro n'existe pas !

    Car A != 0
    Mais AA = Z + 1 donc quand on arrive au dernier chiffre, si on l'incrémente, on passe directement à 1 et non 0 !

    En gros, autant il est facile de générer la liste à partir d'un nombre donné en incrémentant de 1 à la fois, autant pour savoir comment s'écrit 987564 en lettres "à la sauce Excel", je ne vois pas du tout comment faire sans être obligé de représenter tous les nombres de 1 à 987564

  5. #5
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    C'est pas indiscret de te demander l'objectif fonctionnel ?

  6. #6
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Aucun, passer le temps, pour le challenge*
    * rayer mention inutile

    Plus exactement, quelqu'un à posé une question à propos de "compter" de AP à CI.

    En répondant à sa question, et en voulant faire "mieux que chez Bertrand d'en face" je suis tombé sur cet écueil...

    J'imagine que ceux qui travaillent avec Excel sont confronté à ce problème, même si Excel sait aussi référencer ses colonnes par un numérique.

Discussions similaires

  1. Récuperer un nombre dans une chaine de caractère
    Par ColonelHati dans le forum C
    Réponses: 4
    Dernier message: 27/04/2005, 14h50
  2. Réponses: 5
    Dernier message: 15/04/2005, 14h22

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