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

Algorithmes et structures de données Discussion :

Convertir un nombre en base 26


Sujet :

Algorithmes et structures de données

  1. #1
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2013
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 106
    Points : 2 658
    Points
    2 658
    Par défaut Convertir un nombre en base 26
    Bonjour,

    J'aimerai avoir un avis extérieur sur mon code, sur l'algo en lui même.
    Soyer indulgent.

    J'ai besoin de convertir mes nombres en base 26.
    Comme pour les colonnes d'Excel/
    Je me limite à "A" à "ZZ" soit 702.

    Je n'utilise pas le 0

    J'ai l'impression que je n'ai pas choisit la meilleur voie

    Cordialement

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    public class Grille {
    	private static String table26 = " ABCDEFGHIJKLMNOPQRSTUVWXYZ";
     
    	public static char nombreVersTable26(int nombre) {
    		//le nombre doit être supérieur ou égale à 1 et inférieur ou égale à 26 
    		return table26.charAt(nombre);
    	}
     
    	public static String numeroVersTable26(final int numeroToConvert) {
    		int numero = numeroToConvert;
     
    		if(numeroToConvert < 1 || numeroToConvert > 702) {
    			throw new IllegalArgumentException("Le nombre à convertir doit être compris entre 1 et 702");
    		}
     
    		if(numero < 27) {
    return "" + nombreVersTable26(numero%27);			
    		}
     
    		String numeroTable26 = "";
     
    do {
    	int reste = numero % 26;
    			numero = numero / 26;
     
    			if(reste == 0) {
    		numero = numero -1;
    		numeroTable26 = nombreVersTable26(numero) + numeroTable26;
     
    				reste = 26;
    				numeroTable26 += nombreVersTable26(reste);
     
    				numero = 0;
    			} else {
    			numeroTable26 = nombreVersTable26(reste) + numeroTable26;
    			}
     
    		} while(numero > 0);
    		return numeroTable26;
    		}
     
    	public static int indexOfChar(char c) {
    		return table26.indexOf(c);
    	}
     
    	public static double table26VersNombre(final String chaineToConvert) {
    		String chaine = new StringBuilder(chaineToConvert.toUpperCase()).reverse().toString();
    double		nombre = 0;
     
    		for(int i=0;i<chaine.length();i++) {
    		nombre += Math.pow(26, i) * indexOfChar(chaine.charAt(i));
    			System.out.println("indexe" + indexOfChar(chaine.charAt(i)));
    	}
    	return nombre;
    	}
     
    	public static void main(String [] args) {
    //for(int i=26;i <10000;i = i + 26) {
    	for(int i=1;i <10000;i++) {
    	String numero =numeroVersTable26(i);
    	double resultat = table26VersNombre(numero);
     
    		System.out.println(
    				i +" " +
    		numero + " " + 
    						resultat
    		);
     
    		if(i !=resultat ) {
    			System.out.println(
    "******");	
    		}
    		}
    }
    }

  2. #2
    Membre émérite

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation: Chimie et Physique (structure de la matière)
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 333
    Points : 2 570
    Points
    2 570
    Billets dans le blog
    9
    Par défaut Convertir nombre en basz 26
    Bonjour,

    Citation Envoyé par CoderInTheDark Voir le message
    ... J'ai besoin de convertir mes nombres en base 26.
    Comme pour les colonnes d'Excel/
    Je me limite à "A" à "ZZ" soit 702.

    Je n'utilise pas le 0 ...
    Là, c'est très ennuyeux, car tu te prives de l'écriture de tous les nombres comportant un zéro hors de la première position à gauche; tu te condamnes ainsi à l'utilisation d'une suite lacunaire d'entiers.

    Le recours à la base 26 implique le recours à 26 symboles dont les valeurs respectives s'étalent de (0) à (25); le plus simple consiste à attribuer à chacun d'eux la valeur décalée d'une unité de leur rang alphabétique:
    Val('.') = Rang('.') - 1 ;
    ainsi Val('A') = 1 - 1 = 0 ; Val('Z') = 26 - 1 = 25 et Val('ZZ') = 25 + 26*25 = 675 .
    La programmation utilisera la liste ASCII des caractères:
    Val('.') = Ord('.') - Ord('A') = Ord('.') - 65 .

  3. #3
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2013
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 106
    Points : 2 658
    Points
    2 658
    Par défaut
    Citation Envoyé par wiwaxia Voir le message
    Bonjour,
    Là, c'est très ennuyeux, car tu te prives de l'écriture de tous les nombres comportant un zéro hors de la première position à gauche; tu te condamnes ainsi à l'utilisation d'une suite lacunaire d'entiers.
    Le recours à la base 26 implique le recours à 26 symboles dont les valeurs respectives s'étalent de (0) à (25); le plus simple consiste à attribuer à chacun d'eux la valeur décalée d'une unité de leur rang alphabétique:
    Merci pour ta réponse matinale
    J'espère que je ne t'ai pas réveillé

    En fait je dois créer des états, qui doivent ressembler à des feuilles de tableurs.
    Et Excel et Libre office commence les lignes à 1 et pareille pour les colonnes

    C'est juste pour se rapprocher de l'expérience utilisateur

  4. #4
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 128
    Points : 9 558
    Points
    9 558
    Par défaut
    Tu dis que tu te limites aux nombres entre 1 et 702, mais tu as une boucle qui va jusqu'à 10000, bizarre.

    Tu veux une fonction, qui prend un nombre entre 1 et 702 en entrée, et qui renvoie une chaîne entre A et ZZ, c'est bien ça ?( 1=A, 26=Z, 27=AA etc etc )
    A mon avis, tu dois pouvoir faire ça, mais en 5 ou 6 lignes.
    Et comme ce sera plus court, ce sera plus facile à relire.

    Quel est le calcul pour savoir si on va avoir besoin d'1 lettre ou de 2 ?
    Si on a besoin de 2 lettres , quel est le calcul à faire pour trouver la 1ère lettre ?
    Et dans les 2 cas, quel est le calcul à faire pour trouver la dernière lettre ?

  5. #5
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2013
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 106
    Points : 2 658
    Points
    2 658
    Par défaut
    Bonjour,

    Le but est de pouvoir convertir un nombre entre 1 et 702 pour nommer les colonnes à la façon d'un tableur.
    J'ai mis 10000 au pif, de toute façon le code levera une exception si on est hors des bornes.
    702 colonnes c'est trop, mais ça termine en beauté par ZZ
    Le maximum demandé est 367, et c'est lourd à lire pour un humain
    C'est pour des états automatiques
    Je vais peut être exporter en CSV pour les tableurs

    Excel et Calc n'utilise pas le 0.
    Je colle à ça
    C'est pourquoi j'ai mis un espace au début de ma table de lettres de références

    Donc on travaille par 26.

    Si le nombre est inférieur à 27, il est sur une seule lettre
    Il n'y a qu'a demandé la lettre à l'index de ma table de lettre.

    Sauf pour 26 => car le modulo retourne 0pour 26 :
    Division par 26 = 1 reste 0
    Dans ce cas il faut retrancher 1 au numéro et le reste est 26 pour la lettre 27
    C'est pareille tous les 26 .

    Pour 27
    On divise par 26 ça fait 1 et le reste de la division entière est 1 donc AA

    Pour 28 :
    La division donne 1 et il reste 2 soit AB
    pour 52
    52 / 26 = 2 et le reste est 0
    Alors on retranche 1 et on met le reste à 26
    Soit AZ

    pour 703
    703 / 26 = 27 et il reste 1
    Mais là pour l'instant je n'y vais pas/

    J'ai supprimer la condition qui testait si le nombre est inférieur à 26 et retournait la lalettre en directe, le do while fait le travaille

  6. #6
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 128
    Points : 9 558
    Points
    9 558
    Par défaut
    Si tu dois alimenter un tableur, le fait de créer un CSV est une très bonne méthode.
    En temps de traitement, créer un CSV de 1000 lignes par 200 colonnes, c'est instantané.
    Ouvrir un fichier Excel et enchainer une série de 200000 instructions du type 'aller écrire en cellule AA50 telle valeur' , c'est très lent.

    Donc Oui pour l'option CSV. Le CSV a quand même un avantage, c'est qu'il te permet d'aller écrire en cellule AA50, puis en cellule AZ15, puis en cellule BC40 ... dans n'importe quel ordre. Pour un CSV, tu es obligé de constitué ton CSV dans l'ordre. Mais même cette contrainte là, tu peux la contourner.

    Si tu restes sur l'option de calculer la bonne chaine (exemple 29 donne quoi, 29 donne AC), tu peux faire d'une autre façon.

    Dans un premier temps, tu prépares un tableau avec les 702 codes ... ce tableau est assez facile à préparer. Tu le prépares une fois pour toutes, dans une procédure d'initialisation.
    Ensuite quand tu veux connaitre quelle chaine est associée à 29 par exemple, tu lis dans ce tableau.

  7. #7
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 272
    Points : 13 540
    Points
    13 540
    Par défaut
    Bonjour

    Citation Envoyé par wiwaxia Voir le message
    Val('.') = Rang('.') - 1 ;
    ainsi Val('A') = 1 - 1 = 0
    Ah, j'eus aimé que tu eusses raison. Malheureusement, si A valait 0, A serait égal à AA. Et si on distingue A et 0, alors il faudrait 27 étiquettes par série (et il est clair qu'il y en a 26). Non, cela ne marche pas. Il faut l'admettre. Le système de numérotation de Excel ou LibreOffice est foireux. On ne s'en sortira pas avec un simple modulo 26. Vous voulez que je vous fasse rire ? La blague recommence après ZZ. La colonne suivant ZZ est AAA (jusqu'à AMJ dernière colonne).
    On a donc 3 zones avec leur fonctionnement propre :
    • A-Z
    • AA-ZZ
    • AAA-AMJ


    Une seule solution : ne pas faire croire qu'il y a une correspondance naturelle entre le rang de la colonne et son étiquette.

  8. #8
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Bonjour,

    Citation Envoyé par CoderInTheDark Voir le message
    Bonjour,
    Je me limite à "A" à "ZZ" soit 702.
    avec une telle restriction, tu n'as donc que deux symboles à calculer.
    => l'équivalent de la dizaine et de l'unité base 26.

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int d26=input/26;	// dizaine en base 26, par division entière.
    int u26=input%26;	// unité en base 26, par modulo.

    Du fait que tu commences ta numérotation à 1, cela oblige a retrancher 1 à ton nombre de départ pour pouvoir utiliser la division entière et le modulo.

    Et comme tu n'as pas l'équivalent du "zéro" dans ton alphabet A...Z, ca oblige également à décaler le symbole de la dizaine: 1...26 --> 0(A)...25(Z)

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public static String numeroVersTable26(final int numeroToConvert) {
    	int d26=(numeroToConvert-1)/26;
    	int u26=(numeroToConvert-1)%26;
     
    	String output="";
    	if (d26>0) output += (char) ('A' + d26 - 1 );
    	output += (char) ('A' + u26);
     
    	return output;
    }

  9. #9
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 444
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 444
    Points : 5 864
    Points
    5 864
    Par défaut
    salut

    je connais pas bien le java
    mais avec un modulo et une division entière il y a moyen de trouver nos element

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    NBVALMAX = 26 
    DE = QUOTIENT(NUMACONV-1;NBVALMAX);// Premiere colonne si zéro vide 
    RE = MODULO(NUMACONV-1;NBVALMAX)+1 ;// 2ieme Colonne
    Exemple
    26 :
    DE = 0 = ''
    RE = 26 = 'Z'

    680 :
    DE = 26 = 'Z'
    RE = 4 ='D'

    702 :
    DE = 26 = 'Z'
    RE = 26 = 'Z'

    351 :
    DE = 13 = 'M'
    RE = 13 = 'M'
    c'est l’équivalent d'un tableau a double entré

  10. #10
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 272
    Points : 13 540
    Points
    13 540
    Par défaut
    Formule mathématique
    Formule mathématique
    Formule mathématique
    Formule mathématique
    Formule mathématique

    Formule mathématique

    (Un) dénombre les colonnes.

    Un nombre en base 26 touche 26n valeurs.

  11. #11
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2013
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 106
    Points : 2 658
    Points
    2 658
    Par défaut
    Bonjour,

    Désolé du retard, mais il y a un bu sur le forum je n'ai pas reçu de mail de notification de vos réponses.

    Je réponds de façon groupé.

    * Pour le CSV je n'ai pas été cherché loin, dans ma vie antérieure de voyant j'ai fait de la comptabilité avec SAP et il exportait mes données pour Excel en CSV
    J'ai trouvé que ça marchait très bien.
    J'ai ouvert le fichier généré, et quand j'ai vu les points-virgules et les valeurs j'ai compris.
    Ca implique seulement que si sur une ligne on a seulement une valeur à la 100èeme colonne il faut mettre 99 ";" avant l'unique valeur pour la mettre au bon endroit.
    Mais je ne sais pas si SAP pouvait générer des formules.
    Le but était d'importer dans Excel et après je pouvais mettre en forme et ajouter mes formules

    * Comme dit sur le fil, à la place de la fonction, je peux aussi faire une interface avec seulement un tableau, qui contient les valeurs en base 26 a-z, et l'index du tableau et à la fois la clef et la valeur en base 10.
    Et en index 0 je mets ""
    Si il faut choisir entre le temps machine et la mémoire, c'est cette solution qui l'emporte.
    Car lors du rendu la fonction va être très solicitée.
    En plus j'utilise une HashMap pour représenter la matrice/feuille et les coordonnées servent de clef, je ne sais pas ce que ça va donner en matière de performance.

    * Mon code n'a pas passé le teste
    Il échoue après 676 "YZ", en 677au lieu de "ZA" j'obtiens "AZ".
    Tout s'inverse à partir de là.
    Mais là je le garde car je dois avancer.
    Comme déjà dit c'est pas continu il y a trop d'exceptionsn, si je devait utiliser 3 lettres il faudrait une nouvelle condition.
    Moi de "A" à "YZ" ça me suffit largement.
    Pour les humains c'est trop de colonnes et pour la machine 400 colonnes ça suffit
    J'y reviendrai plus tard s'il le faut.
    J'ai aussi un autre code qui marche avec un début à 0.

    * Par contre pour les lignes je dois faire plus que 64000 (16 bits).
    C'est pas la première fois qu'on me le demande.
    Une fois en entretiens pour de la comptabilité, mon interlocutrice a vu sur mon CV que j'avais aussi un BTs d'informatique en plus de celui de comptabilité, elle m'a demandée pourquoi pour leurs extractions ils étaient limité à 64000 ligne sous Excel.
    Ma réaction à été de lui dire comment vous faites pour lire un si gros fichier.
    Mais bon elle m'a répondu qu'elle utilisait un filtre.
    Je me suis pas trop étalé sur le fait qu'Excel devait codées le nombre de ligne sur 16 bits.
    De toute façon je n'étais pas venu pourt un poste de développeur, et pour faire du conseil IT gratos.

    * Le plus marrant, c'est que j'utilise une JTable Swing pour l'instant et que les Jtable commencent aux coodonnées 0,0.
    J'ai dû ajouter dans mon table model 1 aux coordonnées X et Y pour être compatible.
    Après je devrais utiliser un rendu en HTML.
    C'est une solution de transition

    Je corrigerai avec ce qui a été dit

    On va pouvoir bientôt fermer la discussion.

    Merci à tous

    Cordialement

  12. #12
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 444
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 444
    Points : 5 864
    Points
    5 864
    Par défaut
    salut

    voici le code de remplacement que je vois

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    	public static String numeroVersTable26(final int numeroToConvert) {
    		int numero = numeroToConvert;
            int De
    		int re 
    		if(numeroToConvert < 1 || numeroToConvert > 702) {
    			throw new IllegalArgumentException("Le nombre à convertir doit être compris entre 1 et 702");
    		}
            De  =  (numeroToConvert -1) /26
    		RE = ((numeroToConvert -1) % 26)+1
    		String numeroTable26 = nombreVersTable26(De) + nombreVersTable26(RE);
    		return Trim(numeroTable26);
    		}

  13. #13
    Membre chevronné
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 037
    Points : 1 925
    Points
    1 925
    Billets dans le blog
    5
    Par défaut
    Salut. C'est un peu marrant tout ça : Qu'on parle de base et qu'on ne pense une seule fois a traiter avec la puissance n-1de la base.
    Pour n = nombre d'elements a traiter avec la somme des elements.
    Bien entendu il n'est pas question de sauter le Zero. C'est comme en base 10. L'ensemble des chiffres de cette base est de 0-9. Et donc naturellement pour toute autre base c'est de 0 a base -1. La computation des elements se calcule simplement en puissance et somme. Si une seule lettre On fait 26 ^ 0 = 1. 1 + rang de l'objet ( rang numerote de 0 a 25, faut-il insister ?). la somme des rangs des elements (e) + base puissance e-1

  14. #14
    Membre émérite

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation: Chimie et Physique (structure de la matière)
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 333
    Points : 2 570
    Points
    2 570
    Billets dans le blog
    9
    Par défaut Convertir un nombre en base 26
    Bonjour,

    Citation Envoyé par NVCfrm Voir le message
    Salut. C'est un peu marrant tout ça : Qu'on parle de base et qu'on ne pense une seule fois a traiter avec la puissance n-1de la base.
    Pour n = nombre d'elements a traiter avec la somme des elements.
    Bien entendu il n'est pas question de sauter le Zero ...
    C'est bien justement le problème, évoqué dès le début (#02] et qui contraint d'utiliser la liste alphabétique des mots comportant une ou deux majuscules ('A', 'B' ... , 'Z' , 'AA' , 'AB' ... 'ZZ') ...
    Il ne s'agit pas d'une numération de position.

  15. #15
    Membre chevronné
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 037
    Points : 1 925
    Points
    1 925
    Billets dans le blog
    5
    Par défaut
    Bonjour.
    D'où justement le probleme avec certaines valeurs, quand on a une approche qui detache l'ordre des elements de la base en sautant d'un cran. Cette affectation +1 est une abstraction pour l'utilisateur et non le programme.

    Autant pour moi, j'avais repondu en lisant entre les lignes. Quand meme ça reste une piste donnée pour l'autre cas : Conversion d'une base vers la base decimale.

    Maintenant voyons un petit peu le fond du probleme. Hum. C'est naturellement modulo et quotient iterativement du nombre sur la base tant que nombre superieur a zero. . Vu que d'office tu n'as que 2 elements, la tentation est grande de faire la conversion en 2 divisions et 2 modulos.
    La conversion inverse est aussi assez et se fait differemment

  16. #16
    Expert confirmé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 466
    Points : 4 647
    Points
    4 647
    Par défaut
    Bonjour,
    De préférence à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int  reste = numero % 26;
    numero  = numero / 26;
    Il est plus efficace d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int n  = numero / 26;
    int reste = numero - 26*n;
    numero = n;
    En effet, la multiplication est au moins 3 fois plus rapide que la division.
    Mais cela ne reste qu'un pis aller car sur un x86 ou x64, le CPU exécute la même opération idiv pour a / b et a % b, laquelle a le bon goût de retourner à la fois (certains disent en même temps ) le reste et le quotient. Il est possible de trouver (ou pas) une fonction divmod qui appelle directement cette fonction et récupère reste et quotient dans la foulée. Le gain de temps compense très largement le coût d'appel de fonction (en général en assembleur).

    En ce qui concerne la représentation des numéros de colonne il faut, me semble-t-il travailler en base 0..25 et diminuer de 1 le premier chiffre (celui qui correspond à un numero résiduel == 0 pour une étape >= 1). Pour être plus clair un exemple avec 55 (C++ brutal ie C) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Etape   Q       R         Chiffre
    0       Q = 2,  R = 3  -> Chiffre[0] = 'A' + R = 'D'
    1       Q = 0,  R = 2  -> Chiffre[1] = 'A' + R = 'C' if(Q== 0 && Etape > 0) Chiffre[1] -= 1 = 'B' 
    Résultat "BD"
    Ce n'est qu'une représentation pas vraiment une base numérique. Je conseillerais de conserver la valeur numérique entière pour travailler (pas de conversions croisées).

    Salutations

  17. #17
    Expert confirmé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 466
    Points : 4 647
    Points
    4 647
    Par défaut Amélioration ?
    Bonjour,

    La solution que j'ai proposé ne fonctionne que pour deux caractères et encore jusqu'à seulement YZ.

    Une généralisation reprend le principe de ne corriger que le caractère de poids fort mais sans le défaut de s'arrêter à Y.
    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
    char str[16}; // pour 64 bits 14 + 1 soit 15 caractères devraient suffire
    ...
    str[15] = 0;
    ...
    char* InttoAAA(int64_t n) {
       char *p = &(str[15]);
       if(n <= 26) {
          if(n < 26) *(--p) = 'A' + n;
          else [
             *(--p) = 'A';
             *(--p) = 'A';
          }
          return p;
       }
       int64_t r, q;
       do  {
          if(q > 26) { q = n / 26; r = n - 26*q; n = q;} // Ou utiliser DivMod, Div selon le langage et les bibliothèques
          else       { r = n - 1;  n = 0; }
          *(--p) = 'A' + r;
       } while(n > 0);
       return p;
    }
    Ca devrait tomber en marche. J'ai utilisé une forme assez peu inélégante pour éviter les réaffections multiples qu'imposerait l'ordre de droite à gauche des chiffres.

    Salutations

  18. #18
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2013
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 106
    Points : 2 658
    Points
    2 658
    Par défaut
    Bonjour,

    Désolé pour le retard, j'ai eu un gros ruhme la semaine dernière.
    Même pas eu la force de coder, c'est dire si j'étais balade.
    Soyer rassuré j'ai mon masque et j'ai mis du gel hydroalcolique pour taper ce message.

    Je vais fermer la discussion.
    On est tous à peu prèt arriver aux mêmes conclusions.

    Le problème de base est que ce n'est pas de la numération comme passer du binaire au décimal ou l'héxadécimal comme on l'a appris à l'école.
    Je ne peux pas utiliser le 0 et il n'y a pas d'équivalent du 0 dans les lettres.
    Sinon je devrais faire après Z BA et non AA
    Car on cherche seulement à ce que les lettres se suivent par ordre alphabétique.

    Je n'utilise pas le zéro pour avoir une expérience proche des tableurs.
    Le zéro est parlant pour nous, car nos tableaux ont des index qui commencent souvent à 0, mais les utilisateurs n'y sont pas forcément habitués.

    Par contre dans l'autre sens ça marche tout seul.
    Il suffit juste d'inverser la chaîne pour aller plus vite ou que ce soit plus lisible
    et on détermine le rang de la lettre puis on le multiplie par le rang de la décimal à la base 26 moins 1

    Comme c'est pour des colonnes à mon avis ce n'est pas utile d'en d'avoir un grand nombre.
    Je peux me limiter à YZ, car je ne veux pas gérer ce cas pour éviter une conditions en plus dans ma boucle while.
    Mes colonnes peuvent représenter :
    - les jours 365 plus une colonnes pour un titre
    - 52 pour les semaines
    - 24 pour les quinzaines

    Je pense que pour les utilisateurs c'est plus facile de lire un grand nombre de lignes que de lire un grand nombre de colonnes.
    Mes utilisateurs cibles ont l'habitude d'utiliser un tableur ils exportent leur données mais les lisent avec un filtre automatique, en général ils n'ont pas beaucoup de lignes à chaque fois.

    Dans mon cas je vise à moyen terme l'export en CSV

    Et surtout j'ai fait plusieurs table model pour des JTable Swing et c'est hyper redondant.
    Je veux mutualiser avec un composant de rendu de type matrice de donnée comme un tableur

    Je n'ai pas besoin de formule en temps réels, mais éventuellement de formules avant la génération, pour que les utilisateusrs fassent leurs états personelles.

    Je vais passer par une hashmap pour representer la grille de données
    Si la clef existe je retourne l'objet cellule sinon je retourne une chaine vide

    Merci à tous.

    Par contre si je m'occupe des formules il y a du code marrant en perspective, récursivité pour détecter les références circulaires, découpage des formules, ....

    Merci encore à vous tous

    PS
    Je ne sais pas qui parlait d'optimisation mais
    J'ai fait de l'assembleur 68000 sur Amiga 500, et pour optimiser le code, je faisais des trucs comme utiliser l(addition à la place de la multiplicatiojn par 2, ou le décallage de bits. Tout une péoque

  19. #19
    Membre expérimenté
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2020
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juillet 2020
    Messages : 352
    Points : 1 380
    Points
    1 380
    Par défaut
    Citation Envoyé par CoderInTheDark Voir le message
    [...]
    PS
    Je ne sais pas qui parlait d'optimisation mais
    J'ai fait de l'assembleur 68000 sur Amiga 500, et pour optimiser le code, je faisais des trucs comme utiliser l(addition à la place de la multiplicatiojn par 2, ou le décallage de bits. Tout une péoque
    Il faut complètement arrêter de penser à ce genre «d'optimisations» car elles n'en sont plus. Les compilos sont bien plus intelligent que nous pour ça … même s'il y a une division dans le source, dans le code optimisé produit elle sera souvent implémentée par une solution à laquelle peu de personnes pensent.

  20. #20
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2013
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 106
    Points : 2 658
    Points
    2 658
    Par défaut
    Citation Envoyé par WhiteCrow Voir le message
    Il faut complètement arrêter de penser à ce genre «d'optimisations» car elles n'en sont plus. Les compilos sont bien plus intelligent que nous pour ça … même s'il y a une division dans le source, dans le code optimisé produit elle sera souvent implémentée par une solution à laquelle peu de personnes pensent.

    Il y a longtemps que je ne pense plus comme ça.
    C'est pour ça que je parlais au passé.
    Il s'agit du début des années 90
    Et mon k seka asemone je ne sais pas si ils étaient si intélligents.
    On nous disait que la multiplication et la division coûtaient cher
    alors à la place de
    mul 2, d0;
    on faisait add d0, do;

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

Discussions similaires

  1. Réponses: 3
    Dernier message: 03/11/2014, 17h26
  2. [VB.NET] Convertir un nombre base 10 vers 9 sans 0
    Par Dayvid dans le forum Débuter
    Réponses: 0
    Dernier message: 24/05/2013, 18h25
  3. 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
  4. Réponses: 15
    Dernier message: 14/03/2012, 15h12

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