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 :

addition de C chiffres parmi N


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    jlf
    jlf est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 140
    Par défaut addition de C chiffres parmi N
    bonjour

    j'ai une liste de N nombres

    je voudrais trouver toutes les valeurs possible de l'addition de P chiffres dans ces N et compter leur nombre d'apparition

    par exemple
    N=5 (chiffres a=1, ..e=5)
    p = 2

    je cherche les 10 résultats suivants :
    a+b=3
    a+c=4
    a+d=5 (apparait 2 fois sur 10)
    ...
    d+e=9 (1 fois)

    j'ai essayé avec des boucles for mais je coince

    j'entrevois une soluce en récursif mais je crains de vite déborder la pile (mes P et N seront assez grands), je ne sais pas si ça vaut le coup d'essayer comme ça

    merci de votre aide

  2. #2
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Une solution théorique :

    Developper un arbre avec des branches de profondeur P avec comme info pour les noeuds : le nombre de l'ensemble N choisi, la liste des fils.

    La racine a N fils.
    La liste des noeuds fils d'un noeud de profondeur X a N-X fils (liste des nombres differents de celui du noeud X et de ses ancetres)
    Ensuite, il reste juste à trier les sommes obtenues pour les noeuds terminaux (somme du nombre de la feuille+nombre associés aux ancètres).

    Attention, prendre uniquement des fils supérieurs aux pères si on veut éviter les doublons (commme 2+4 et 4+2).

    En pratique, il suffit de traiter une seule branche (tableau de P nombres) et de reperer pour chaque niveau l'index du fils (tableau de P index de valeur 1 à N).

  3. #3
    jlf
    jlf est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 140
    Par défaut
    pardon mais je ne comprend pas bien ce qu'il faut faire exactement

    un petit exemple pour concrétiser me serait utile ?
    en tous cas merci de cette réponse

  4. #4
    Expert confirmé

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 818
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 818
    Par défaut
    Salut,

    Une autre méthode... utiiliser un compteur binaire, à chaque bit correspondant un de tes chiffres. Ensuite, tu incrémentes ton compteur, tu vérifies que le nombre de bits correspondant activés correspond au nombres de chiffres que tu veux additionner, et tu stockes la valeur de la somme dans un tableau (éventuellement, pour les combinaisons non prises en compte, tu mets 0 comme résultat)
    Au final, il ne te reste plus qu'à parcourir le tableau contenant les résultats pour compter le nombre d'occurences.

    Exemple: avec tes 5 chiffres (1, 2, 3, 4 et 5), somme 2 par 2

    compteur à 5 bits (car 5 chiffres), noté a4.a3.a2.a1.a0
    a4 correspond au 5
    a3 au 4
    a2 au 3
    a1 au 2
    et a0 au 1

    on fait partir le compteur de 1 et on incrémente:

    compteur=1, en binaire 00001, nombre de bits acitvés: 1, pas bon, suivant
    compteur=2, en binaire 00010, 1 bit activé, pas bon
    compteur=3, en binaire 00011, 2 bits activés, ok, 2+1=3
    ...
    compteur=6, en binaire 00110, 2 bits activés, 3+2=5
    compteur=7, en binaire 00111, 3 bits activés, pas bon
    ...
    et ainsi de suite, jusqu'au dernier:
    compteur=31, en binaire 11111, 3 bits activés, pas bon

    Tu as au final un tableau de 31 valeurs résultat: {0, 0, 3, ... , 5, 0, ... ,0} sur lequel tu peux travailler.
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  5. #5
    jlf
    jlf est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 140
    Par défaut
    je ne sais pas si j'ai bien compris mais ça parait séduisant

    par exemple si je veux tester tous les paquets de 10 parmi 30 :

    1) mon compteur ira de 1 à 2^30
    2) pour tous les valeurs de ce compteur je recherche celles dont l'expression binaire possède 10 bits à 1, et j'additionne les nombres dont l'indice est celui des bits activés

    c'est ça ?

    mais comment faire pour détecter le nombre et le rang des bits mis à 1 ? (je pense faire ça en Delphi)

    et par ailleurs ça me limite à une liste de 32 nombres avec des entiers "normaux" ?
    à la rigueur ce serait acceptable pour moi, disons mieux que rien, mais bon j'envisageais de laisser un pc travailler plusieurs semaines d'affilée ;o))

  6. #6
    Expert confirmé

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 818
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 818
    Par défaut
    Citation Envoyé par jlf
    c'est ça ?
    oui, tout à fait ça.

    Citation Envoyé par jlf
    mais comment faire pour détecter le nombre et le rang des bits mis à 1 ? (je pense faire ça en Delphi)
    deux possibilités:
    1. utiliser un entier pour le compteur, le convertir en binaire et analyser les bits (avec la limitation que tu soulignes sur le nombre de bits)
    2. utiliser un tableau de dimension N, qui sert à stocker la valeur de chaque bit, et gérer l'incrémentation de manière logicielle
    Citation Envoyé par jlf
    et par ailleurs ça me limite à une liste de 32 nombres avec des entiers "normaux" ?
    oui, et c'est d'ailleurs pour ça que la seconde solution ci-dessus serait plus souple.

    Citation Envoyé par jlf
    à la rigueur ce serait acceptable pour moi, disons mieux que rien, mais bon j'envisageais de laisser un pc travailler plusieurs semaines d'affilée ;o))
    En quoi la durée de travail limiterait la méthode? C'est juste pour la limitation 32 bits ça?
    Avec un tableau de dimension N, tu n'es plus limité en taille (enfin... moins qu'avec un entier sur 32 bits), donc tu peux monter assez haut.
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

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

Discussions similaires

  1. Combinaisons à 6 chiffres possibles parmi 20 nombres
    Par djbebop dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 14/05/2011, 14h46
  2. Réponses: 28
    Dernier message: 03/06/2009, 09h31
  3. Addition de chiffre a partir d'une colonne
    Par DeFCrew dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 03/10/2007, 11h18
  4. selectionne 2 chiffres parmis 4
    Par phpaide dans le forum Langage
    Réponses: 10
    Dernier message: 22/06/2006, 12h15
  5. Choisir un chiffre aléatoire parmi une liste
    Par djsbens dans le forum Général Java
    Réponses: 2
    Dernier message: 08/03/2006, 18h19

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