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 :

Tester toutes les permutations possibles à partir d'une liste de référence et afficher celle qui convient


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 7
    Par défaut Tester toutes les permutations possibles à partir d'une liste de référence et afficher celle qui convient
    Bonsoir,
    Je suis à la recherche de solution pour ce problème mathématique: Utiliser la totalité des neufs chiffres de 1 à neuf (chacun remplace une seule lettre ) pour remplacer correctement les lettres de a à i et avoir une égalité correcte dans :
    a/(bc) + d/(ef) + g/(hi) = 1

    où (bc) , (ef) et (hi) sont des écritures décimales et non des produits. ( ie: (bc)=10xb+c , ...)

    Je voudrais écrire un programme Pascal qui peut tester toutes les permutations possibles et afficher celles qui sont des solutions, à partir de la liste 123456789.

    Je ne suis qu'un amateur en programmation, j'ai essayé mais j'ai pas réussi et j'ai besoin de votre aide.

    Merci d'avance,
    Alex

  2. #2
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 229
    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 229
    Par défaut
    Le prof qui t'a proposé cet exercice est un bon prof. C'est un exercice intéressant. Un bon prof comme ça, on ne va pas saboter son travail, en te donnant la solution toute faite à son exercice. Tu as fait quoi pour chercher la solution ?

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 7
    Par défaut
    Merci tbc92 !
    Je suis un amateur trop vieux et trop loins du temps de l'apprentissage.. L'exercice est un défi lancé par un ami. auquel j'ai pensé longuement pour trouver rigoureusement une solution.
    mais je n'ai pas réussi. voila pourquoi je voudrai renouer avec mon vieux Turbo7 et chercher une solution.

    @ tbc92,

    j'ai pas voulu tester sa directement en effectuant une boucle for sur tous les entiers de 111111111 à 999999999
    Je veux me limiter aux permutations seulement

  4. #4
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 229
    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 229
    Par défaut
    Si tu testes tous les entiers de 111111111 à 999999999 , tu vas avoir les entiers comme 111111120 donc avec le chiffre 0 --> hors-périmètre. Et tu vas avoir les entiers comme 111111111 , donc répétition du chiffre 1, donc hors périmètre. Tu vas tester énormément de combinaisons hors-périmètre.

    Si tu testes les nombres a de 1 à 9 , b de 1 à 9, avec b différent de a, c de 1 à 9, avec c différent de a et de b ... etc etc, tu vas diviser le temps de traitement par 3000 environ.

    Un programme 'brutal', fait en appliquant le conseil ci-dessus, va aller très vite et te donner la liste des réponses en moins d'une seconde.

    Tu peux même te limiter aux cas où a<d et d<g ... pour des raisons de 'symétrie'.

  5. #5
    Membre Expert

    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
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Il te faut définir un tableau de 9 entiers, dont tu pourras éliminer à chaque combinaison testée les termes déjà utilisés, et à ne pas réemployer.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    TYPE TabE = ARRAY[1..9] OF Byte;
    CONST Lini: TabE = (1, 2, 3, 4, 5, 6, 7, 8, 9);
    VAR Liste: TabE:
    // Initialisation de la variable
    Liste:= Lini;
    Il te faut ensuite procéder à l'énumération des combinaisons, à priori très nombreuses - il y en a théoriquement 9! = 362880 - cela reste encore raisonnable, mais 99 = 387420489 si l'on n'élimine pas les termes identiques, et ce sera alors très long ...

    L'expression de la somme S = a/(bc) + d/(ef) + g/(hi) autorisant la permutation des 3 termes, tu peux imposer la restriction:
    a < d < g qui évitera la sortie de termes identiques (comme on te l'a déjà suggéré); c'est ce qu'effectuera la triple boucle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    FOR a:= 1 TO 7 DO
      FOR d:= (a + 1) TO 8 DO
        FOR g:= (d + 1) TO 9 DO 
          BEGIN
            ...
          END;
    À ce stade, il ne te reste plus que 6 termes et tu peux envisager de travailler sur une liste réduite, que l'on peut établir de la façon suivante:
    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
     
    PROCEDURE CalcLi(Xu, Xv, Xw, Xm: Byte; VAR L_6: TabE);
      VAR i, k: Byte;
      BEGIN
        k:= 0; 
        FOR i:= 1 TO Xm DO
          IF (i<>Xu) AND ((i<>Xv) AND (i<>Xw)) THEN 
            BEGIN
              Inc(k); L_6[k]:= i
            END;
     
        WHILE (k<9) DO BEGIN
                         Inc(k); L_6[k]:= 0
                       END
      END;
    Le programme deviendrait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    FOR a:= 1 TO 7 DO
      FOR d:= (a + 1) TO 8 DO
        FOR g:= (d + 1) TO 9 DO 
          BEGIN
            CalcLi(a, d, g, 9, Liste);
            ...
          END;
    et il ne resterait plus qu'à travailler sur 6 termes (b, c, e, f, h, i), en les combinant encore 3 par 3, et en éliminant à mi-parcours les 3 valeurs sorties d'une façon semblable
    Ici cependant, l'énumération répond à des contraintes différentes.

    # Autre variante: au lieu de calculer la somme des quotients S = a/(bc) + d/(ef) + g/(hi) , tu pourrais envisager celui du produit S' = S*(bc)*(ef)*(hi) = a*(ef)*(hi) + d*(bc)*(hi) + g*(bc)*(ef) ,
    résultat entier pour lequel la vérification de l'égalité S' = (bc)*(ef)*(hi) ne pose pas de difficulté.

    Code à vérifier - j'ai pu laisser passer des erreurs.

  6. #6
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    Par défaut
    Bonjour

    Dénombrons.
    On tire 9 chiffres parmi 9, dans l'ordre, et sans répétition; c'est donc un arrangement.
    Il s'agit même d'une factorielle puisque tous les éléments sont concernés.
    9! = 362880

    Sauf que les 3 termes de la somme sont permutables. (puisque l'addition est commutative)
    Donc il y a 6 fois moins d'ordres puisque placer 3 parmi 3 dans l'ordre et sans répétition est aussi un arrangement, et même une factorielle. 3!=6.

    Il y a donc 362880 / 6 = 60480 sommes uniques.

    Largement faisable en force brute par un ordinateur.

    En classant les numérateurs par ordre croissant, tu dois pouvoir t'en sortir sans trop réfléchir.


    et il ne resterait plus qu'à travailler sur 6 termes (b, c, e, f, h, i), en les combinant encore 3 par 3, et en éliminant à mi-parcours les 3 valeurs sorties d'une façon semblable
    Ah oui. Je n'avais pas pensé à ça.
    6/12=7/14 donc on risque de faire 2 fois la même sous-séquence.

    Mais si ce n'est pas les mêmes nombres, ce n'est pas la même réponse.
    Donc on ne peut pas simplifier.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 24/09/2018, 00h50
  2. Réponses: 1
    Dernier message: 30/11/2011, 10h07
  3. Procéder toutes les permutations possibles d'une liste
    Par supergrey dans le forum Mathématiques
    Réponses: 3
    Dernier message: 21/10/2011, 15h08
  4. Réponses: 23
    Dernier message: 18/02/2010, 15h42
  5. [Algorythme] Tester toutes les combinaisons possibles
    Par strike57 dans le forum VBA Access
    Réponses: 7
    Dernier message: 25/03/2009, 12h26

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