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 :

Exercice conversion nombre base 10 en base k


Sujet :

C

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2015
    Messages : 151
    Points : 49
    Points
    49
    Par défaut Exercice conversion nombre base 10 en base k
    Bonjour,

    Je suis débutant en C, j'ai trouvé la fonction suivante pour convertit un nombre en base 2:

    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
     
    void  decomp(int nb)
    {
        if (nb > 1)
            decomp(nb >> 1);
        putchar('0' + (nb & 1));
    }
     
    int   main()
    {
        int  nb;
     
        nb = 126;
        decomp(nb);
        return (0);
    }
    Je veux généraliser ça, convertit un nombre en base k.

    Merci d'avance.

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Bonjour!
    Quelques questions préliminaires:

    Soit le nombre 196581342, en base 10.
    Quelle est l'écriture en base 2? en base 5? en base 12? et en base 37?

    La vraie question:
    Comment as-tu trouvé les réponses? C'est à dire: quelle méthode as-tu employée?

    La solution à ton problème de code est de répondre précisément à la question "Comment faire, de manière générale?"
    Une fois la méthode trouvée, il "suffit" de l'écrire en C.

    Si tu sais comment faire, tu dois pouvoir l'expliquer, à nous d'abord, puis à ton compilateur.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2015
    Messages : 151
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par ternel Voir le message
    Si tu sais comment faire, tu dois pouvoir l'expliquer, à nous d'abord, puis à ton compilateur.

    Moi j'ai fait ça sur python, et j'aimerai traduire en C.

    Je fais ça, pour n=21

    21 = 10 * 2 + 1
    j'affiche 1

    10 = 2 * 5 + 0
    j'affiche 0

    5 = 2 * 2 + 1
    j'affiche 1

    2 = 2 * 1 + 0
    j'affiche 0

    1 = 2 * 0 + 1
    j'affiche 1

    Résultat = 10101

    Et sur python, voici la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    def base_k(n, k): 
        q = -1 
        res = '' 
        while q != 0: 
            q = n // (k+1) #Calcule le div
            r = n % (k+1) # calcule le reste de la division
            res = `r` + res #concaténer le reste de la division 
            n = q 
        return res
    Merci Encore.

  4. #4
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Bonjour,

    Voilà ce que je donne habituellement :
    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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
     
    Calcul dans différentes bases
     
    Conventions
     
    Dans tout ce document, on va utiliser les notations suivantes:
     
    Le symbole ^ signifie 'élever à la puissance'
    par exemple 10^3 signifie 'élever 10 à la puissance 3' c'est à dire 10*10*10 = 1000
     
    Un nombre suivi par
    #B est écrit en base 2  (B pour binaire)
    #H est écrit en base 16 (H pour Hexadécimal)
    sans précision, il est écrit en base 10
     
    Le symbole * signifie 'multiplier'
     
    Dans les calculs, pour les divisions :
      Q signifie Quotient
      R signifie Reste
     
    Rappel : Tout nombre élevé à la puissance 0 (zéro) vaut 1
    (10^0 = 2^0 = 16^0 = 1)
     
     
     
    Quand nous écrivons un nombre, par exemple 573, cela signifie qu'il est égal à la somme:
     
      3 * 10^0  = 3*1    =    3
    + 7 * 10^1  = 7*10   =   70
    + 5 * 10^2  = 5*100  =  500
                           -----
                            573
     
     
    On peut transcrire cela dans une autre base, par exemple en base 2
     
    On ne disposera alors que de 2 symboles, 0 et 1.
    Les chiffres en partant de la DROITE signifieront :
    0 ou 1 * 2^0
             2^1
             2^2
             2^3
             etc...
     
    Soit le nombre 1000111101#B, calculons sa valeur en base 10
     
      1 * 2^0  = 1
    + 0 * 2^1  = 0
    + 1 * 2^2  = 4
    + 1 * 2^3  = 8
    + 1 * 2^4  = 16
    + 1 * 2^5  = 32
    + 0 * 2^6  = 0
    + 0 * 2^7  = 0
    + 0 * 2^8  = 0
    + 1 * 2^9  = 512
                -----
                 573
     
    On peut utiliser une autre base, 16.
    Il nous faut alors 16 symboles pour représenter les différents 'chiffres'.
    Par convention, on a choisi d'utiliser 0 à 9, puis A à F
     
    A vaut donc 10 (décimal)
    B = 11
    C = 12
    D = 13
    E = 14
    F = 15
     
    Avec le même principe que pour la base 2, voyons le nombre 23D#H
     
      D * 16^0 =  13
    + 3 * 16^1 =  48
    + 2 * 16^2 = 512
                -----
                 573
     
    Le passage d'une base quelconque en base 10 est donc très simple.
     
     
     
     
    Voyons maintenant comment passer de la base 10 à une autre, exemple en base 16.
     
    La technique suivante permet de trouver les chiffres successifs en partant de la DROITE.
     
    soit le nombre 573.
    Divisons le par la base destination, soit 16
    573 / 16 = 35(Q) + 13(R)
      le reste = 13 = D#H est le premier chiffre à droite de la valeur cherchée
     
    répétons le calcul avec le quotient du calcul précédent (35)
    35 / 16 = 2(Q) + 3(R)
      le reste = 3 = 3#H est le deuxième chiffre en partant de la droite
     
    et encore une fois :
    2 / 16 = 0(Q) + 2(R)
      le reste = 2 = 2#H est le troisième chiffre en partant de la droite
     
    Comme le quotient = 0, on peut arrêter.
     
    Le nombre 573 s'écrit donc 23D#H
     
    En supprimant les commentaires, on obtient une disposition claire:
     
              (Q)   (R)   (R en base 16)
    573 / 16 = 35 + 13      D
     35 / 16 =  2 +  3      3
      2 / 16 =  0 +  2      2
     
      On lit les restes de bas en haut = 23D#H
     
     
    Refaisons le calcul pour écrire 573 en base 2
     
              (Q)    (R)
    573 / 2 = 286   + 1
    286 / 2 = 143   + 0
    143 / 2 =  71   + 1
     71 / 2 =  35   + 1
     35 / 2 =  17   + 1
     17 / 2 =   8   + 1
      8 / 2 =   4   + 0
      4 / 2 =   2   + 0
      2 / 2 =   1   + 0
      1 / 2 =   0   + 1
     
      terminé puisque le quotient = 0
     
      et donc en lisant les restes de bas en haut, la valeur est 1000111101#B
     
     
    Voilà, j'espère que c'est assez clair.
    Si les cons volaient, il ferait nuit à midi.

  5. #5
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    C'est pas mal du tout. L'explication est assez simple.

    Dans les systèmes de numérations positionnels (où la position d'un chiffre dans le nombre influe sur sa valeur), il y a une quantité nommée base, qui est un facteur multiplicatif entre une position et la suivante.

    Généralement, le chiffre le plus multiplié est écrit en premier.
    Ainsi, en base B, on a 200 = 2 * B * B + 0 * B + 0 = 0 + B * (0 + B * (2) ).

    Le chiffre à la position p est le reste de la division entière (ou euclidienne) par B à la puissance p. On peut aussi dire les restes successifs de la division entière par B.
    le reste est obtenu via l'opérateur modulo, %Mais tu dois déjà le savoir, puisque tu l'utilises dans ton code python.

    Concrètement, pour passer de python à C, dans ton cas, il suffit quasiment de rajouter les accolades et points-virgules.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  6. #6
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Après réflexion, pour comprendre ton code initial, il dois juste te manquer quelques notions d'arithmétique binaire.
    >> correspond à décaler les bits d'un entier vers la droite, du nombre de bits indiqué (par le second argument).
    & correspond à l'opération binaire et, bit par bit

    '0' + (b & 1) signifie le code numérique du caractère '0' plus la valeur de b & 1.
    Cette dernière expression vaut 1 si le dernier bit de b est 1, et 0 sinon. Par construction, '0'+1 == '1'. Ainsi, l'argument de putchar est le caractère '1' si le bit de poids faible (celui des "unités") de b est 1, et le caractère '0' si c'est 0.

    En fait b>>1 vaut b / 2 et b & 1 vaut b % 2, la différence étant dans les performances potentielles. Mais normalement, les compilateurs savent l'optimiser de toute façon.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2015
    Messages : 151
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par ternel Voir le message

    Mais tu dois déjà le savoir, puisque tu l'utilises dans ton code python.

    Concrètement, pour passer de python à C, dans ton cas, il suffit quasiment de rajouter les accolades et points-virgules.
    Re,

    J'ai fait ça et n'as pas marché :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    char base_k(int n, int k)
    {
    	int q=-1;
    	int r;
    	char res ;
    	while (q != 0)
        {
    		q = n / (k+1);
    		r = n % (k+1);
    		res = (char)r + res;
    		n = q ;
        }
        return res;
    }
    Merci.

  8. #8
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    C'est normal, en python, res est une chaine de caractère, et l'opérateur + concatène les différents caractères les uns après les autres.
    En C, char est le type d'un entier capable de stocker un unique caractère. l'opérateur + est celui des entiers et ajoute les valeurs.

    Il faut passer par une chaine de caractère, (un char* et les fonctions qui vont avec) ou mieux, dans ton cas, simplement l'afficher (par exemple via le putchar() du code initial).
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  9. #9
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2015
    Messages : 151
    Points : 49
    Points
    49
    Par défaut
    Oui vous avez raison,

    D'ailleurs le résultat sur python est en base 3 pour les nombres de 0 à 8:

    00
    01
    02
    10
    11
    12
    20
    21
    22

    En C:

    0
    1
    2
    1
    2
    3
    2
    3
    4

    Il fait la somme !!!!

    Je vais changer où ?

    Voici le code:

    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
    #include <iostream>
    #include <stdio.h>
    #include<math.h>
     
    /* run this program using the console pauser or add your own getch, system("pause") or input loop */
    char base_k(int n, int k)
    {
    	int q=-1;
    	int r;
    	char res ;
    	while (q != 0)
        {
    		q = n / (k+1);
    		r = n % (k+1);
    		res = (char)r + res;
    		n = q ;
        }
        return res;
    }
     
     
    int main(int argc, char** argv) {
    	int cas_general;
    	int n =2;
    	int k=2;
    	cas_general=pow((k+1),n);
    	//printf("Le resultat est  %d\n", cas_general);
     
    	int i;
     
    	for (i= 0 ; i < cas_general ; i++)
    	{
    	    char d= base_k(i, k);
    		printf("Le resultat de la fonction est  %d\n", d);
    	}
     
     
    	return 0;
    }
    Merci Encore.

  10. #10
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Ca, c'est à toi de voir.
    Que font chaque ligne de ton code?

    Coder, ce n'est pas écrire au hasard.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Citation Envoyé par hichem0550 Voir le message
    Je suis débutant en C, j'ai trouvé la fonction suivante pour convertit un nombre en base 2:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    void  decomp(int nb)
    {
        if (nb > 1)
            decomp(nb >> 1);
        putchar('0' + (nb & 1));
    }
     
    int   main()
    {
        int  nb;
     
        nb = 126;
        decomp(nb);
        return (0);
    }

    Je veux généraliser ça, convertit un nombre en base k.
    Ooh, une version qui corrige l'inversion de l'ordre des chiffres par récursivité. J'aime.

    Bon, on va faire simple: Remplace >> 1 par / 2 et & 1 par % 2 (Modulo 2) et tu atteindras l'illumination.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Réponses: 0
    Dernier message: 21/01/2014, 22h36
  2. Conversion d'un nombre d'une base à une autre base
    Par avnt34 dans le forum Général Python
    Réponses: 3
    Dernier message: 04/01/2014, 17h06
  3. Comment lisez-vous les nombres dans les différentes bases ?
    Par SimpleMe dans le forum Assembleur
    Réponses: 1
    Dernier message: 29/08/2007, 10h31
  4. [Débutant] Conversion de base 10 vers base 16
    Par beegees dans le forum Assembleur
    Réponses: 7
    Dernier message: 30/10/2006, 17h31
  5. Mysql Configuration nombre de connexion aux bases de données
    Par Thierry8 dans le forum Installation
    Réponses: 2
    Dernier message: 15/09/2005, 20h54

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