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 :

Calculer les horaires de travail


Sujet :

Algorithmes et structures de données

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2009
    Messages : 95
    Points : 58
    Points
    58
    Par défaut Calculer les horaires de travail
    Bonjour à tous,

    Voilà mon problème: je dois créer des horaires de travail.

    Imaginons une personne qui travaille mi-temps. Si on représente son horaire sur deux semaines, les jours où il travaille toute la journée sont représentés par un 7, les jours où il travaillent juste la demi-journée sont représentés par un 3 et ses jours d'absences par un 0. Ceci uniquement pour les jours ouvrés donc une série de 10 nombres.

    Je dois trouver toutes les possibilités.

    Par exemple si sur deux semaines, je travaille temps plein la première semaine et je suis en congé la seconde, ça donne ceci: 7777700000.

    Si je travaille deux jours la première semaine et trois la seconde, ça donne ceci: 7700077700, etc. Donc là, je travaille le lundi et mardi la première semaine et le lundi, mardi et mercredi la suivante.

    Compliquons la chose: J'ai deux journées pour lesquelles je suis présent une demi-journée que je représente par un 3.

    Si je travaille deux jours la première semaine et deux jours la seconde plus deux demi jours ça donne ceci: 7700077330.

    On pourrait donc trouver un horaire de quelqu'un qui travaille tous les jours mais juste le matin: 3333333333.

    Bon, je dois trouver toutes les combinaison possibles et il y en a un paquet. Et je ne vois absolument pas comment m'y prendre.

    Si quelqu'un avait une idée...

    Merci

  2. #2
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    Bonjour
    Voici mon aide mais je ne garantis rien
    Pour chacune des 10 positions il y a 3 possibilités : 0 3 et 7 soit
    3^10 = 205 891 132 094 649 cas [2ème EDIT] décidément ... 3^10 = 59 049
    Pour les lister tous il suffit de compter en base ..4[EDIT] euh 3 bien sûr dans notre cas ...
    en partant de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    0000000000
    0000000001
    0000000002
    0000000010
    0000000011
    0000000012
    0000000100
    etc .
    2222222222
    et au passage de remplacer chaque 1 par 3 et chaque 2 par 7
    =>
    0000000000
    0000000003
    0000000007
    0000000030
    0000000033
    0000000037
    0000000300
    etc .
    7777777777
    Emérite, émérite je ne pense pas ... plutôt dans le développement depuis FORT FORT longtemps, c'est mon job, ça oui
    A part ça ... Il ne pleut jamais en Moselle !

  3. #3
    Membre confirmé
    Homme Profil pro
    .
    Inscrit en
    Juin 2002
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : .
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2002
    Messages : 239
    Points : 567
    Points
    567
    Par défaut
    Bonjour.

    La durée de travail doit être de 35 heures sur les deux semaines, pour une personne travaillant à mi-temps.

    Cela réduit considérablement le nombre de possibilités.

    Comme 3^10 = 59049, un algorithme qui teste toutes les possibilités et ne retient que celles correspondant à 35 heures, est possible.

  4. #4
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    Citation Envoyé par Prof Voir le message
    ...
    Comme 3^10 = 59049
    ...
    Tiens oui 3^10 = 59 049 j'ai du taper 3^100 ... c'est vrai que ça me paraissait beaucoup ...
    Emérite, émérite je ne pense pas ... plutôt dans le développement depuis FORT FORT longtemps, c'est mon job, ça oui
    A part ça ... Il ne pleut jamais en Moselle !

  5. #5
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 033
    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 033
    Points : 9 333
    Points
    9 333
    Par défaut
    Nombre de combinaisons ? On va mettre la barre un peu plus haut, on va faire la différence entre "travailler le matin" et "travailler l'après midi".
    On a donc 20 demi-journées, et chaque demi-journée est travaillée ou non. Nombre de combinaisons = puissance(2;20) = 1048576

    Et notre individu doit travailler 10 demi-journées.
    Nombre de façons de choisir 10 éléments parmi un ensemble de 20 éléments, ça doit faire 20! /10! / 10! = 184756

    J'ai un nombre bien supérieur à ceux évoqués, parce que, pour quelqu'un qui travaille tous les matins, je vais avoir : 10101010101010101010,
    Et pour quelqu'un qui travaille tous les après-midis, je vais avoir : 01010101010101010101
    Alors que si on synthétise à la journée, ces 2 configurations se codent : 3333333333 (plus de distingo entre 1+0 et 0+1)
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  6. #6
    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 081
    Points
    16 081
    Par défaut
    Comment faire 35 heures sur 10 jours avec des journées de 7h ou 3.5h ?

    Cas #1: 35 = 5*7
    Cas #2: 35 = 4*7 + 2*3.5
    Cas #3: 35 = 3*7 + 4*3.5
    Cas #4: 35 = 2*7 + 6*3.5
    Cas #5: 35 = 1*7 + 8*3.5
    Cas #6: 35 = 10*3.5

    Combien de possibilités pour le cas "x journées de 7 heures" dans un calendrier de 10 jours ?

    C(x,10)


    Combien de possibilités pour le cas "y journées de 3.5 heures" dans un calendrier de 10 jours ?

    C(y,10)


    Combien de possibilités pour le cas "x journées de 7 heures + y journées de 3.5h" dans un calendrier de 10 jours ?


    1. combien de possibilités pour disposer "x" journées de 7h dans un calendrier de 10 jours ? --> C(x,10)
    2. combien de possibilités pour disposer "y" journées de 3.5h dans un calendrier de 10-x jours --> C(y,10-x)

    => nombre de possibilités = C(x,10) * C(y,10-x)


    Quel est la solution du problème de départ ?

    Il faut additionner les possibilités pour chacun des cas.

    => C(5,10) + C(4,10) * C(2,6) + C(3,10) * C(4,7) + C(2,10) * C(6,8) + C(1,10) * C(8,9) + C(10,10)
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  7. #7
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 033
    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 033
    Points : 9 333
    Points
    9 333
    Par défaut
    Correctif sur la dernière ligne de pseudocode :
    => C(5,10) + C(4,10)*C(2,6) + C(3,10)*C(4,7) + C(2,10)*C(6,8) + C(1,10)*C(8,9) + C(10,10)

    Ca, ça permet de compter le nombres de solutions. Si maintenant on veut le listing de toutes les solutions, une solution très bourrine :

    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
     
    pour j1 = 0 a 2
     pour j2 = 0 a 2
       pour j3 = 0 a 2
         pour j4 = 0 a 2
           pour j5 = 0 a 2
             pour j6 = 0 a 2
                si j1+j2+J3+J4+j5+j6 <= 10 et j1+j2+J3+J4+J5+J6 >= 2 alors
                // Si au bout de 6 jours , on n'a pas au moins 2 demi-journées, on ne pourra pas arriver à 10, et si on a déjà dépassé 10, idem, inutile de continuer l'analyse.
                  pour j7 = 0 a 2
                     si j1+j2+J3+J4+j5+j6+j7  <= 10 et j1+j2+J3+J4+J5+J6 + J7 >= 4 alors
                        pour j8 = 0 a 2
                           si j1+j2+J3+J4+j5+j6+j7+j8  <= 10 et j1+j2+J3+J4+J5+J6+J7+J8 >= 6 alors  
                             pour j9 = 0 a 2
                                j10 = 10 - (j1+j2+J3+J4+j5+j6+j7+j8+J9)
                                si j10 >= 0 et j10 <= 2 alors 
                                   Print ( j1,j2,j3,j4,j5,j6,j7,j8,j9, j10)
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2009
    Messages : 95
    Points : 58
    Points
    58
    Par défaut
    L'idée d'utiliser une base 3 me semble intéressante.

    En cumulant la valeur des 10 chiffres ont doit obtenir 10. Si c'est bon on sauvegarde dans un fichier et ensuite on remplace les 1 par 3 et 2 par 7.

    Merci pour la piste, je creuse maintenant pour faire un compteur sur une base 3.

  9. #9
    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 081
    Points
    16 081
    Par défaut
    Citation Envoyé par tbc92 Voir le message
    Correctif sur la dernière ligne de pseudocode :
    => C(5,10) + C(4,10)*C(2,6) + C(3,10)*C(4,7) + C(2,10)*C(6,8) + C(1,10)*C(8,9) + C(10,10)
    Oui,exact. copiage/collage un peu rapide ma part. Ca m'apprendra a faire des efforts de rédaction.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  10. #10
    Membre confirmé
    Homme Profil pro
    .
    Inscrit en
    Juin 2002
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : .
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2002
    Messages : 239
    Points : 567
    Points
    567
    Par défaut
    Je pense qu'il est plus simple de passer par la décomposition en base 3 qu'utiliser 10 boucles imbriquées.

    En comptant les demi-journées et non les heures, l'algorithme est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    POUR n DE 0 A 59048 FAIRE
         m <- n
         S <- 0
         POUR i DE 1 A 10 FAIRE
              S <- S + (m mod 3)
              m <- m div 3
         FINFAIRE
         SI S = 10 ALORS Afficher(n)
         FINSI
    FINFAIRE
    Ici mod désigne le modulo, c'est-à-dire le reste dans la division euclidienne.

    Pour achever l'écriture du programme, il reste à écrire la procédure Affiche(n) qui affiche les chiffres de la décomposition de n en base 3.

    En Pascal, le tout s'écrit :

    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
     
    program horaire;
     
    var n,m : longint;
        S,i : integer;
     
    Procedure Affiche(m:longint);
        var i : integer;
        begin
          for i := 1 to 10 do
              begin
                Case (m mod 3) of
                  0 : write('0');
                  1 : write('3');
                  2 : write('7');
                end;
                m := m div 3;
              end;
          writeln;
        end;
     
    begin
      for n := 0 to 59048 do
          begin
            m := n;
            S := 0;
            for i := 1 to 10 do
                begin
                  S := S + (m mod 3);
                  m := m div 3;
                end;
            if S = 10 then Affiche(n);
          end;
          writeln('fini');
          readln;            { pause }
    end.
    On récupère alors les 8953 solutions.

    Si on veut affiner l'étude en travaillant avec les demi-journées plutot qu'avec les journées,
    on remplace 3^10 -1 = 59048 par 2^20 -1 = 1048575, en on travaille avec la base 2 à la place de la base 3.
    On trouve alors les 184756 solutions.

  11. #11
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    J'en trouve bizarrement bien plus => 184 756 (je suis dans l'excès aujourd'hui )
    Je pars de 1 à 1048575(base10)
    Dans ma boucle je convertis chaque valeur à traiter en base 4
    j'affecte la valeur 3.5 au chiffre 1 et 2 (distinction matin et après-midi) et la valeur 7 à 3 et je somme ... si ça fait 35 je sors le résultat
    et j'incrémente au passage mon compteur de 1 ...
    donc
    0000033333 => '3' * 7 = 5 * 7 = 35
    0000113333 => (('1'+'1') * 2) + ('3' * 7) = ((3.5+3.5) * 2) + (4 * 7) = 35
    0000123333 => ('1' * 2) + ('1' * 2) + ('3' * 7) = (3.5 * 2) + (3.5 * 2) + (5 * 7) = 35
    etc.



    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
     
    program Project3;
    uses wincrt,math;
    function IntToBaseStr(Value, BaseOut: integer): String;
    const
      Digits = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
     
    var
      rmndr: integer;  // reste
    begin
      // validité de la base?
      if not InRange(BaseOut, 2, length(Digits)) then
        writeln('NOK');
      Result := '';
      repeat
        divmod(Value, BaseOut, Value, rmndr);
        Result := Digits[rmndr+1] + Result;
      until Value = 0;
    End;
     
    type
      short = 1..9;
     
    var
      i,j,convert,compteur:longint;
      som:real;
      s:string[20];
     
    label
      theend, randoms, repeatative;
     
     
    begin
     
      compteur :=0;
      for i:=1 to 1048576 do
          begin
                s := IntToBaseStr(i, 4);
                som:=0;
                for j:=1 to 10 do
                    begin
                          if (s[j] = '1') then som := som + 3.5;
                          if (s[j] = '2') then som := som + 3.5;
                          if (s[j] = '3') then som := som + 7;
     
                    end;
                if (som = 35) then
                  begin
                    compteur := compteur+1;
                    writeln(s);
                  end;
             end;
      writeln(compteur);
      readln;
    end.
    Nom : Capture.JPG
Affichages : 975
Taille : 30,4 Ko
    Emérite, émérite je ne pense pas ... plutôt dans le développement depuis FORT FORT longtemps, c'est mon job, ça oui
    A part ça ... Il ne pleut jamais en Moselle !

  12. #12
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 033
    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 033
    Points : 9 333
    Points
    9 333
    Par défaut
    Dans le listing avec toutes les combinaisons, tu as des 0 ,des 1, des 2 et des 3
    0 = journée non travaillée
    1 = matinée travaillée
    2 = après-midi travaillée
    3 = journée complète travaillée.

    Pour une journée avec seulement une demi-journée travaillée, tu as donc une codification différente selon qu'on travaille le matin ou l'après midi. C'est pour cela que tu as 184756 combinaisons.
    Si tu disais :
    0 = journée non travaillée
    1 = matinée ou après midi travaillée (donc ça regroupe les 1 et les 2 de la version actuelle)
    3 = journée complète travaillée

    Alors, tu tomberais à 8953 combinaisons.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2009
    Messages : 95
    Points : 58
    Points
    58
    Par défaut
    Citation Envoyé par tbc92 Voir le message
    Dans le listing avec toutes les combinaisons, tu as des 0 ,des 1, des 2 et des 3
    0 = journée non travaillée
    1 = matinée travaillée
    2 = après-midi travaillée
    3 = journée complète travaillée.

    Pour une journée avec seulement une demi-journée travaillée, tu as donc une codification différente selon qu'on travaille le matin ou l'après midi. C'est pour cela que tu as 184756 combinaisons.
    Si tu disais :
    0 = journée non travaillée
    1 = matinée ou après midi travaillée (donc ça regroupe les 1 et les 2 de la version actuelle)
    3 = journée complète travaillée

    Alors, tu tomberais à 8953 combinaisons.
    Bonjour,

    Oui, c'est bien vers ça que je m'oriente.

    Malheureusement en C#, la méthode Convert.ToInt32 n'accepte que les bases 2,8,10,16.

    Je continue de chercher.

  14. #14
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 033
    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 033
    Points : 9 333
    Points
    9 333
    Par défaut
    Je pense que lafonction Convert.toInt32 prend des nombres écrits en base exotique, et les convertit en entier. Toi, ce dont tu as besoin, c'est la fonction inverse, une fonction qui prend un entier, et qui renvoie sa représentation dans une base. La représentation voulue, c'est une suite de chiffres, ou même, une suite de symboles. On peut donc le stocker comme une chaîne de caractères, ou comme un tableau d'entiers, mais pas comme un entier.

    Voici en gros une fonction qui va renvoyer une chaîne de 10 caractères , pour convertir un nombre en base 3, ou en base n presque quelconque..
    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
     
     
    function convert_base_v1(n,b )
     
    // n est un entier 
    // b est un entier, entre 0 et 16
    // valeur renvoyée  = une chaine de caractères, qui représente n en base b
    // Exemple : convert_base_v1( 33, 3) renvoie "1020"
     
     
    ch est une chaine = "0123456789ABCDEF"
     
    i, r  est un entier 
    i = n
    tantque i > 0
        r = i%b   // ou r = mod( i, b) selon les langages ...    reste de la division de i par b 
        ch = milieu( ch, r, 1) + ch 
        i = ( i - r) / b 
    fin
    ch  = complete_a_gauche  ( ch, 10 , "0") // On veut une chaîne de 10 caractères, on complète à gauche par des 0 si nécessaire ... 
    renvoyer ch
    Ou encore une fonction très similaire, pour renvoyer un Tableau de 10 entiers au lieu d'une chaîne de 10 caractères.
    C'est probablement mieux de travailler avec des tableaux d'entiers, plutôt qu'introduire des chaines de caractères.

    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
     
     
    function convert_base_v2(n,b )
     
    // n est un entier 
    // b est un entier, entre 0 et 16
    // valeur renvoyée  = un tableau de 10 entiers, qui représente n en base b
    // Exemple : convert_base_v2( 33, 3) renvoie (1, 0,2, 0) 
     
    tb est un tableau de 10 entiers 
     
    i, r,  k,  est un entier 
    i = n
    k = 9
    tantque i > 0
        r = i%b   // ou r = mod( i, b) selon les langages ...    reste de la division de i par b 
        tb[k] = r
        k--
        i = ( i - r) / b 
    fin
     
    renvoyer tb
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2009
    Messages : 95
    Points : 58
    Points
    58
    Par défaut
    Citation Envoyé par tbc92 Voir le message
    Je pense que lafonction Convert.toInt32 prend des nombres écrits en base exotique, et les convertit en entier. Toi, ce dont tu as besoin, c'est la fonction inverse, une fonction qui prend un entier, et qui renvoie sa représentation dans une base. La représentation voulue, c'est une suite de chiffres, ou même, une suite de symboles. On peut donc le stocker comme une chaîne de caractères, ou comme un tableau d'entiers, mais pas comme un entier.

    Voici en gros une fonction qui va renvoyer une chaîne de 10 caractères , pour convertir un nombre en base 3, ou en base n presque quelconque..
    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
     
     
    function convert_base_v1(n,b )
     
    // n est un entier 
    // b est un entier, entre 0 et 16
    // valeur renvoyée  = une chaine de caractères, qui représente n en base b
    // Exemple : convert_base_v1( 33, 3) renvoie "1020"
     
     
    ch est une chaine = "0123456789ABCDEF"
     
    i, r  est un entier 
    i = n
    tantque i > 0
        r = i%b   // ou r = mod( i, b) selon les langages ...    reste de la division de i par b 
        ch = milieu( ch, r, 1) + ch 
        i = ( i - r) / b 
    fin
    ch  = complete_a_gauche  ( ch, 10 , "0") // On veut une chaîne de 10 caractères, on complète à gauche par des 0 si nécessaire ... 
    renvoyer ch
    Ou encore une fonction très similaire, pour renvoyer un Tableau de 10 entiers au lieu d'une chaîne de 10 caractères.
    C'est probablement mieux de travailler avec des tableaux d'entiers, plutôt qu'introduire des chaines de caractères.

    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
     
     
    function convert_base_v2(n,b )
     
    // n est un entier 
    // b est un entier, entre 0 et 16
    // valeur renvoyée  = un tableau de 10 entiers, qui représente n en base b
    // Exemple : convert_base_v2( 33, 3) renvoie (1, 0,2, 0) 
     
    tb est un tableau de 10 entiers 
     
    i, r,  k,  est un entier 
    i = n
    k = 9
    tantque i > 0
        r = i%b   // ou r = mod( i, b) selon les langages ...    reste de la division de i par b 
        tb[k] = r
        k--
        i = ( i - r) / b 
    fin
     
    renvoyer tb

    La deuxième solution me semble bien, je teste demain.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Alors, tu tomberais à 8953 combinaisons.
    Comment est-ce que tu calcules ça?

  16. #16
    Membre confirmé
    Homme Profil pro
    .
    Inscrit en
    Juin 2002
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : .
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2002
    Messages : 239
    Points : 567
    Points
    567
    Par défaut
    Comment est-ce que tu calcules ça?
    Le programme en Pascal que j'ai détaillé plus haut affiche 8953 solutions.

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2009
    Messages : 95
    Points : 58
    Points
    58
    Par défaut
    Citation Envoyé par Prof Voir le message
    Le programme en Pascal que j'ai détaillé plus haut affiche 8953 solutions.
    Ah,

    Entretemps j'en ai discuté avec un ami prof de math (oui ceux qui font souffrir leurs élèves).

    Voici sa méthode:

    1 1 1 1 1 1 1 1 1 1 > 1 "permutation de 10 avec 10 répétitions: (10!)/(10!) = 1" OK

    0 1 1 1 1 1 1 1 1 2 > "permutation de 10 avec 8 répétitions: (10!)/(8!) = 90" OK

    0 0 1 1 1 1 1 1 2 2 > "permutation de 10 avec répétitions de 2, 6, 2: (10!)/(2! · 6! · 2!) = 1260"

    0 0 0 1 1 1 1 2 2 2 > "permutation de 10 avec répétitions de 3, 4, 3: (10!)/(3! · 4! · 3!) = 4200"

    0 0 0 0 1 1 2 2 2 2 > "permutation de 10 avec répétitions de 4, 2, 4: (10!)/(4! · 2! · 4!) = 3150"

    0 0 0 0 0 2 2 2 2 2 > "permutation de 10 avec répétitions de 5, 5: (10!)/(5! · 5!) = 252"

    Donc un total de: 8953.

  18. #18
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 033
    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 033
    Points : 9 333
    Points
    9 333
    Par défaut
    Les 6 cas détaillés par ton prof sont les 6 mêmes que ceux détaillés par pseudocode, à 11h15.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2009
    Messages : 95
    Points : 58
    Points
    58
    Par défaut
    Citation Envoyé par tbc92 Voir le message
    Les 6 cas détaillés par ton prof sont les 6 mêmes que ceux détaillés par pseudocode, à 11h15.
    Heu, OK.

    Mon niveau de math ne doit sans doute pas être à la hauteur parce que là je ne vois rien de similaire.

    Mais bon, j'ai tort, c'est certain.

    Mais c'est pour ça qu'il y a des forum de discussion. Non??

  20. #20
    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 081
    Points
    16 081
    Par défaut
    Citation Envoyé par rj450 Voir le message
    Heu, OK.
    Mon niveau de math ne doit sans doute pas être à la hauteur parce que là je ne vois rien de similaire.
    1 1 1 1 1 1 1 1 1 1 <--> 35 heures avec 10 demi-journées de 3.5h <--> 35 = 10*3.5

    0 1 1 1 1 1 1 1 1 2 <--> 35 heures avec 1 journée complète de 7h et 8 demi-journées de 3.5h <--> 35 = 1*7 + 8*3.5

    ...

    0 0 0 0 0 2 2 2 2 2 <--> 35 heures avec 5 journées complètes de 7h <--> 35 = 5*7

    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 01/04/2016, 00h33
  2. [2008R2] calcul du charge de travaille pour les requétes ad hoc
    Par Boubou2020 dans le forum Administration
    Réponses: 4
    Dernier message: 10/06/2015, 17h37
  3. Réponses: 2
    Dernier message: 02/08/2005, 14h53
  4. [MFC]Calculer les FPS
    Par inerti@ dans le forum MFC
    Réponses: 6
    Dernier message: 19/03/2003, 19h22

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