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

Pascal Discussion :

Permutations, maximum et minimum des chiffres d'un entier


Sujet :

Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Décembre 2007
    Messages : 24
    Par défaut Permutations, maximum et minimum des chiffres d'un entier
    On se propose de saisir un entier N de trois chiffres, de déterminer et d'afficher tous ses nombres qui peuvent etre formés par les chiffres de N, ainsi que le plus petit et le plus grand de ces nombres.
    Exemples :
    Pour N = 427
    * Les nombres formées par les chiffres de N sont : 427, 472, 724, 742, 247, 274
    *Le plus petit nombres est 274 et le plus grand nombre 742.

    Mon idée est la suivante :

    On lit un entier (N) entre [100..999] puis on le convertit en chaîne de caractères puis on applique un algo de tri pour trouver le maximum de ses chiffres.
    Deuxièmement on affiche la chaîne inversément pour obtenir le minimum de ces chiffres. Enfin on fait des permutations. Et voilà, mon problème est dans cette procédure.

    Que pensez-vous de mon idée et SVP aidez-moi à résoudre ce problème et corriger mes fautes car mon idée n'est pas optimale pour le moment.

    Merci pour tous j'attends vos discussions.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Tunisie

    Informations forums :
    Inscription : Août 2006
    Messages : 193
    Par défaut
    Holla !!
    Je connais la solution pour avoir le nombre des cas possibles
    la solution se trouve dans une formule mathématique :
    Il s'agit d'un arrangement de n objet parmi n telque n est la longueur du chiffre choisi
    A=n!/(n-p)!
    il faut tout simplement créer une fonction factorielle et puis tu l'appelles...
    Pour l'affichage des nombres je crois qu'il faut convertir en chaine ainsi tu la coupes et tu déplaces ch[1] dans la position (2,3,...,n) ensuite ch[2] dans [1,3,...,n] de même jusqu'à arriver a ch[n] essaye d'utiliser la procédure copy ou insert !! un tableau peut être pour sauvegarder les valeurs...
    Pour le plus petit et le plus grand un tri est indispensable tout en utilisant un tableau et n'oublie pas d'utiliser les procédures VAL (conversion en valeur) et STR (conversion en chaine)
    bonne chance

  3. #3
    Membre Expert
    Avatar de krachik
    Inscrit en
    Décembre 2004
    Messages
    1 964
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 964
    Par défaut
    Bonjour
    Citation Envoyé par WhiteTigerZ
    Je connais la solution pour avoir le nombre des cas possibles
    la solution se trouve dans une formule mathématique :
    Il s'agit d'un arrangement de n objet parmi n telque n est la longueur du chiffre choisi
    A=n!/(n-p)!
    Alors Faux sur toute la ligne,un chiffre ne peut avoir une longueur de plus de 1(sauf un nombre),Pourquoi parler d'un arrangement alors qu'on parle d'une simple permutation ? un petit rappel sur les "arrangements" et "permutations" devraitent t'eclairer.
    N etant le nombre et L etant sa longueur (converti en chaine pour connaitre sa longueur) le nombre de cas possible sera n!

    Citation Envoyé par JetliMohamed

    On lit un entier (N) entre [100..999] puis on le convertit en chaîne de caractères puis on applique un algo de tri pour trouver le maximum de ses chiffres.
    Oui c'est une possibilité et pour trouver le minimum il faudra faire un autre tri (trop de travail) ,Et si tu faisais d'abord les permutations et que tu plaçais dans un tableau ,apres appliquer algo de tri pour avoir le min et le max(comme ça tu ne tri qu'uen seule fois)

    Enfin on fait des permutations. Et voilà, mon problème est dans cette procédure.
    Mais tu n'as rien proposé concernant ça alors je te laisse y reflechir et apres on vera ou tu en es.
    Bon courage
    @+

  4. #4
    Rédacteur
    Avatar de darrylsite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 299
    Par défaut
    Citation Envoyé par krachik Voir le message
    Bonjour

    Alors Faux sur toute la ligne,un chiffre ne peut avoir une longueur de plus de 1(sauf un nombre),Pourquoi parler d'un arrangement alors qu'on parle d'une simple permutation ? un petit rappel sur les "arrangements" et "permutations" devraitent t'eclairer.
    N etant le nombre et L etant sa longueur (converti en chaine pour connaitre sa longueur) le nombre de cas possible sera n!


    Oui c'est une possibilité et pour trouver le minimum il faudra faire un autre tri (trop de travail) ,Et si tu faisais d'abord les permutations et que tu plaçais dans un tableau ,apres appliquer algo de tri pour avoir le min et le max(comme ça tu ne tri qu'uen seule fois)


    Mais tu n'as rien proposé concernant ça alors je te laisse y reflechir et apres on vera ou tu en es.
    Bon courage
    @+
    Il n' a pas du tout tort en parlant d' arrangement.A=n!/(n-p)! si n=p alors (n-p)!=1. Donc A=n!. Vous avez donc tous raison.

    Citation Envoyé par JetliMohamed;
    Que pensez-vous de mon idée et SVP aidez-moi à résoudre ce problème et corriger mes fautes car mon idée n'est pas optimale pour le moment.
    Il recherche donc une idée optimale et vous lui parlez des chaines de caracteres, str,val ... Savez vous le coup du calcul ? (=log...lol).
    Moi, je suis toujours amoureux de ce petit operateur : mod (et aussi div).
    Ex: 312 mod 10 est 2; 31 mod 10 est 1; 3 mod 10 est 3
    pour trouver les chiffres, il suffit de savoir jouer. chiffre[i]= n mod 10 et n=n div 10. Jusqu' à avoir n egal à 0.
    Et c ' est plus intuitif comme ça (j' aime la facilité).

    Pour avoir les permutation, c' est simple. Tu peux garder les chiffres dans un tableau de 3 elements. Ensuite faire 3 boubles sur les indices du tableau et eviter que les indice se repetent (pour respecter la permutation : un element doit apparaitre une et une seule fois)
    Ex: Si t=(1,4,9), tu peux avoir nombre[1]=1+4*10+9*100

    Aussi, je ne vois pas pourquoi vous voulez faire un tri. Et sur quel tableau ?
    Moi, j' aime la facilité (encore une fois). Vu qu' on a aucun interet à garder les nombres en memoire, il suffit d' avoir 2 variables par exemple mini et max (initialiser avec mini=1000 et max=0 par exemple) et de les comparer avec les nombres generés par la permutation. On obtient ainsi le minimum et le maximum.

  5. #5
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 966
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 966
    Par défaut
    Fio,
    Citation Envoyé par darrylsite Voir le message
    ...
    Il recherche donc une idée optimale et vous lui parlez des chaines de caracteres, str,val ... Savez vous le coup du calcul ? (=log...lol).
    Moi, je suis toujours amoureux de ce petit operateur : mod (et aussi div).
    Ex: 312 mod 10 est 2; 31 mod 10 est 1; 3 mod 10 est 3
    pour trouver les chiffres, il suffit de savoir jouer. chiffre[i]= n mod 10 et n=n div 10. Jusqu' à avoir n egal à 0.
    Et c ' est plus intuitif comme ça (j' aime la facilité).
    Et à ton avis, comment est faite la conversion ?

    Ici, on a un outil simple pour obtenir le résultat (conversion en chaine), pourquoi chercher à faire autrement ?

    Pour le temps de calcul, tu obtiendras au mieux ce que fait la conversion, probablement même moins bien, car il est fort possible que les calculs soient optimisés au niveau de la conversion (mais ce serait à vérifier, pour chaque version de chaque compilateur ).

  6. #6
    Rédacteur
    Avatar de darrylsite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 299
    Par défaut
    Citation Envoyé par droggo Voir le message
    Fio,

    Et à ton avis, comment est faite la conversion ?

    Ici, on a un outil simple pour obtenir le résultat (conversion en chaine), pourquoi chercher à faire autrement ?

    Pour le temps de calcul, tu obtiendras au mieux ce que fait la conversion, probablement même moins bien, car il est fort possible que les calculs soient optimisés au niveau de la conversion (mais ce serait à vérifier, pour chaque version de chaque compilateur ).
    Je suis ne suis pas d' accord avec toi. Pour trouver le dernier chiffre, on fait : 122 mod 10. Or si on doit passer par les chaines :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    str(122,ch);
    chiffre:=str[3]
    En plus, c' est un exercice d' ecole donc il doit montrer qu' il maitrise vraiment le probleme en utilisant des astuces mathematiques.
    Une fois qu' on est rodé, on peut faire ce qu' on veut parce qu' on sait combien ça nous coute.
    Il faut toujours commencer sur de bonnes bases. Tu le repetes à chaque fois.

  7. #7
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 89
    Par défaut
    Citation Envoyé par JetliMohamed
    On se propose de saisir un entier N de trois chiffres, de déterminer et d'afficher tous ses nombres qui peuvent etre formés par les chiffres de N, ainsi que le plus petit et le plus grand de ces nombres.
    Exemples :
    Pour N = 427
    * Les nombres formées par les chiffres de N sont : 427, 472, 724, 742, 247, 274
    *Le plus petit nombres est 274 et le plus grand nombre 742.

    Mon idée est la suivante :

    On lit un entier (N) entre [100..999] puis on le convertit en chaîne de caractères puis on applique un algo de tri pour trouver le maximum de ses chiffres.
    Deuxièmement on affiche la chaîne inversément pour obtenir le minimum de ces chiffres. Enfin on fait des permutations. Et voilà, mon problème est dans cette procédure.

    Que pensez-vous de mon idée et SVP aidez-moi à résoudre ce problème et corriger mes fautes car mon idée n'est pas optimale pour le moment.

    Merci pour tous j'attends vos discussions.
    J'ai eu le même sujet exactement dans un test, la semaine dernière. J'ai ouvert un autre sujet : . J'aurais peut-être dû continuer dans celui-là. Tu trouveras une solution au problème. Elle n'est peut-être pas optimale comme tu dis mais, c'est au moins une solution. En plus, ça marche avec plus de 3 chiffres (ou 3 caractères). Lis attentivement le code dans le message de Droggo parce qu'il est mieux indenté que le miens, il sera plus facile à comprendre.


    Donc toi tu dis que, pour trouver les permutations, d'abord tu tries les caractères de la chaîne par ordre croissant, puis décroissant afin de connaître la permutation qui donne le maximum et celle qui donne le minimum. Ainsi, tu obtiens deux permutations parmi 6 (ou plus si le nombre N contient plus de 3 chiffres). Il t'en reste 4 alors. As-tu déjà pensé à comment les retrouver ?

    Ciao!

  8. #8
    Rédacteur
    Avatar de darrylsite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 299
    Par défaut
    Citation Envoyé par katrena99 Voir le message
    J'ai eu le même sujet exactement dans un test, la semaine dernière. J'ai ouvert un autre sujet : . J'aurais peut-être dû continuer dans celui-là. Tu trouveras une solution au problème. Elle n'est peut-être pas optimale comme tu dis mais, c'est au moins une solution. En plus, ça marche avec plus de 3 chiffres (ou 3 caractères). Lis attentivement le code dans le message de Droggo parce qu'il est mieux indenté que le miens, il sera plus facile à comprendre.


    Donc toi tu dis que, pour trouver les permutations, d'abord tu tries les caractères de la chaîne par ordre croissant, puis décroissant afin de connaître la permutation qui donne le maximum et celle qui donne le minimum. Ainsi, tu obtiens deux permutations parmi 6 (ou plus si le nombre N contient plus de 3 chiffres). Il t'en reste 4 alors. As-tu déjà pensé à comment les retrouver ?

    Ciao!
    Enfin, j' ai pensé à une solution beaucoup plus simple et optimale pour trouver les permutations des nombres à trois chiffres:
    1. On convertit le nombre en chaine soit nombre. Pour faire simple, tu peux utiliser str.

    1. Tu fais trois boucles for imbriquées avec les indices i,j,k par exemple.
      Tu auras toutes les permutations avec "nombre[i]+nombre[j]+nombre[k]" pour
      i<>j et i<>k et j<>k

    Pour resumer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    pour i de 1 à 3 
     pour j de 1 à 3
      pour k de 1 à 3
       si i<>j et i<>k et j<>k alors
        "c' est une concatenation"
        ecrire(nombre[i]+nombre[j]+nombre[k])
       finsi
      finpour
     finpour
    finpour

  9. #9
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 89
    Par défaut
    Citation Envoyé par darrylsite Voir le message
    Enfin, j' ai pensé à une solution beaucoup plus simple et optimale pour trouver les permutations des nombres à trois chiffres:
    1. On convertit le nombre en chaine soit nombre. Pour faire simple, tu peux utiliser str.

    1. Tu fais trois boucles for imbriquées avec les indices i,j,k par exemple.
      Tu auras toutes les permutations avec "nombre[i]+nombre[j]+nombre[k]" pour
      i<>j et i<>k et j<>k

    Pour resumer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    pour i de 1 à 3 
     pour j de 1 à 3
      pour k de 1 à 3
       si i<>j et i<>k et j<>k alors
        "c' est une concatenation"
        ecrire(nombre[i]+nombre[j]+nombre[k])
       finsi
      finpour
     finpour
    finpour
    Bravo! Je n'y ai pas pensé une seule seconde. Seulement, ça ne marche que pour des entiers de 3 chiffres. Avec 3 chiffres uniquement, je préfère remplir le tableau ou afficher moi-même : t[1]:=ch, t[2]:=ch[1]+ch[3]+ch[2] et ainsi de suite...
    Mais c'est vraiment une très bonne idée darrylsite!!

    Ciao!

Discussions similaires

  1. Fonction de calcul de somme des chiffres d'un entier
    Par sam343 dans le forum Langage
    Réponses: 3
    Dernier message: 07/10/2009, 17h35
  2. Extraction des chiffres d'un entier
    Par adrian07 dans le forum Pascal
    Réponses: 5
    Dernier message: 21/04/2009, 17h22
  3. Réponses: 6
    Dernier message: 01/02/2009, 00h14
  4. que des chiffres..
    Par roots_man dans le forum ASP
    Réponses: 2
    Dernier message: 18/11/2004, 15h31
  5. Commande pour afficher des chiffres apres la virgule
    Par manar dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 23/09/2004, 18h28

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