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

Python Discussion :

Combien de fois de suite cet entier est divisible par 2


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Analyse système
    Inscrit en
    Juin 2018
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Alimentation

    Informations forums :
    Inscription : Juin 2018
    Messages : 180
    Par défaut Combien de fois de suite cet entier est divisible par 2
    Bonjour à tous,

    Pour m’entraîner, je me suis amusé à créer une suite de nombre de 1 à 1000, et à catégoriser chacun d'eux par le nombre de fois ou ce dernier est divisible par 2.

    Cependant, ayant du utiliser des set() car de nombreuses copies de nombres se créaient (je n'ai pas réussi à savoir pourquoi), les même nombre se retrouvent plusieurs fois sur plusieurs catégories. Exemple : Le nombre 128 se retrouve dans la catégorie "Divisible 2 fois par 2", puis dans "Divisible 3 fois par 2", puis dans "Divisible 4 fois par 2", etc (je me suis arrêté à 7). Or, j'aimerais que "128" ne se trouve uniquement dans la catégorie "Divisible par 7" ...

    Voici mon code (bien sur, il est améliorable) :

    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
     
     
    deux = set()
     
    trois = set()
     
    quatre = set()
     
    cinq = set()
     
    six = set()
     
    sept = set()
     
    SUPsept = set()
     
    compt = 0
    nombre = 0
     
    while nombre < 1000:
     
    	nombre = nombre + 1
     
    	test = nombre
     
    	compt = 0
     
     
    	while test % 2 == 0:
    		test = test / 2
    		compt = compt + 1
    		if compt == 2:
    			deux.add(nombre)
    		if compt == 3:
    			trois.add(nombre)
    		if compt == 4:
    			quatre.add(nombre)
    		if compt == 5:
    			cinq.add(nombre)
    		if compt == 6:
    			six.add(nombre)
    		if compt == 7:
    			sept.add(nombre)
    		if compt > 7:
    			SUPsept.add(nombre)
    		pass
     
    deux_sorted = sorted(deux)
     
    trois_sorted = sorted(trois)
     
    quatre_sorted = sorted(quatre)
     
    cinq_sorted = sorted(cinq)
     
    six_sorted = sorted(six)
     
    sept_sorted = sorted(sept)
     
    SUPSept_sorted = sorted(SUPsept)
     
     
    print("\n\n")
     
    print("------------- DIVISIBLE 2 FOIS-------------")
     
    print(deux_sorted)
     
    print("\n\n")
     
     
    print("------------- DIVISIBLE 3 FOIS-------------")
     
    print(trois_sorted)
     
    print("\n\n")
     
     
    print("------------- DIVISIBLE 4 FOIS-------------")
     
    print(quatre_sorted)
     
    print("\n\n")
     
     
    print("------------- DIVISIBLE 5 FOIS-------------")
     
    print(cinq_sorted)
     
    print("\n\n")
     
    print("------------- DIVISIBLE 6 FOIS-------------")
     
    print(six_sorted)
     
    print("\n\n")
     
    print("------------- DIVISIBLE 7 FOIS-------------")
     
    print(sept_sorted)
     
    print("\n\n")
     
    print("------------- DIVISIBLE > 7 FOIS-------------")
     
    print(SUPSept_sorted)
     
    print("\n\n")

  2. #2
    Membre chevronné
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    514
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 514
    Par défaut
    Et bien je pense qu'il faut revoir la base même de votre code, et utiliser des fonctions.

    voici un exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def f(n):
    	k = 0
    	while n%2 == 0: # tant que n est divisible par deux
    		n //= 2  #on le devise par 2 (on prend la partie entière pour éviter OverflowError)
    		k+=1 # on incrémente le nombre de fois où il est divisible par 2
    	return k # on retourne le nombre de fois où il est divisible par 2
    ps: On peut généraliser assez facilement pour n divisible k fois par m

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 688
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 688
    Par défaut
    Salut,

    Citation Envoyé par preliator Voir le message
    Cependant, ayant du utiliser des set() car de nombreuses copies de nombres se créaient (je n'ai pas réussi à savoir pourquoi)
    Relisez votre code!
    Vous ajoutez votre nombre a un set avant même de avoir combien de fois il est divisible par 2.
    De plus, compt (le résultat) est monotone croissant de 0 à 9 (pour les nombres inférieurs à 1000).
    liste[compt] vous permet de récupérer l'objet auquel ajouter nombre...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 813
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 813
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par preliator Voir le message
    Voici mon code (bien sur, il est améliorable) :
    Certes.

    Déjà c'est très maladroit de donner à une variable un nom trop ciblé (ex deux=set()). Le nom d'une variable est déterminé par la nature de ce qu'elle contient de façon générale (ex nombre=set()). Comment feras-tu si tu veux monter jusqu'à 500 ?

    Ensuite il faut absolument utiliser les outils permettant de factoriser les opérations.
    Par exemple cette suite
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if compt == 2: deux.add(nombre)
    if compt == 3: trois.add(nombre)
    etc...
    Devient aisément
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    diviseur={2 : set(), 3: set(), 4 : set()}                # ou encore diviseur=dict((n, set()) for n in range(2, 8))
    diviseur[compt].add(nombre)
    C'est à la fois plus simple à coder et plus évolutif...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre confirmé
    Homme Profil pro
    Analyse système
    Inscrit en
    Juin 2018
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Alimentation

    Informations forums :
    Inscription : Juin 2018
    Messages : 180
    Par défaut
    Merci à vous pour vos réponses cela m'aidera beaucoup

  6. #6
    Membre confirmé
    Homme Profil pro
    Analyse système
    Inscrit en
    Juin 2018
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Alimentation

    Informations forums :
    Inscription : Juin 2018
    Messages : 180
    Par défaut
    Citation Envoyé par Sve@r Voir le message

    Par exemple cette suite
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if compt == 2: deux.add(nombre)
    if compt == 3: trois.add(nombre)
    etc...
    Devient aisément
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    diviseur={2 : set(), 3: set(), 4 : set()}                # ou encore diviseur=dict((n, set()) for n in range(2, 8))
    diviseur[compt].add(nombre)
    .
    Je reviens vers vous concernant la formule :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    diviseur=dict((n, set()) for n in range(2, 8))
    diviseur[compt].add(nombre)
    J'ai vraiment du mal à savoir ou placer ces éléments.

    Voilà le dernier code simplifié que j'ai crée, mais cela ne me met que des erreurs.

    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
     
    diviseur=dict((n, set()) for n in range(2, 8))
     
    compt = 0
    nombre = 0
     
    while nombre < 1000:
     
    	nombre = nombre + 1
     
    	test = nombre
     
    	compt = 0
     
     
    	while test % 2 == 0:
    		test = test / 2
    		compt = compt + 1
    		diviseur[compt].add(nombre)
    		pass
     
    print(diviseur)

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 688
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 688
    Par défaut
    Salut,

    Si vous écrivez:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    diviseur=dict((n, set()) for n in range(2, 8))
    c'est que vous supposez que le nombre de divisions par 2 sera dans l'intervalle 2..7. Sinon, vous allez planter en KeyError.

    Et si vous ne vous êtes pas précipité dans le chapitre qui parle des dictionnaires de votre tuto préféré avant de recopier du code juste histoire de comprendre pourquoi çà pourrait fonctionner....

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 813
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 813
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par preliator Voir le message
    Je reviens vers vous concernant la formule :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    diviseur=dict((n, set()) for n in range(2, 8))
    diviseur[compt].add(nombre)
    J'ai vraiment du mal à savoir ou placer ces éléments.
    C'est une fois qu'on sait combien de fois 2 divise (par exemple) 1000 (donc 10 fois) qu'on peut stocker "1000" dans la bonne case (la case 10). Donc à la fin de la boucle interne et pas dans la boucle interne. Ce que wiztricks a déjà dit hier à 16h35

    Et j'ai écrit dict((n, set()) for n in range(2, 8)) juste pour montrer la syntaxe générale de création d'un dictionnaire avec n clefs déjà prêtes (en considérant donc que le dico n'aurait besoin que de ces n clefs et pas d'autres).
    Si maintenant le dico n'est pas prévisible à l'avance, alors il faut le créer vide et dès qu'on a besoin d'une clef, tester d'abord si la clef existe ou pas.

    Et si j'étais toi, je commencerais par écrire une fonction dédiée à dire uniquement combien de fois deux divise n. Ainsi, tu pourrais la tester de façon individuelle (séparation des problèmes). Et dès qu'elle est prête, te suffirait de l'intégrer dans ta boucle de nombres de 1 à 1000.

    Bref un truc de ce style
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    def nb_deux(n):
    	... (code de la fonction qui va dire combien de fois 2 divise n et qui retourne ce nombre)...
    # nb_deux()
     
    diviseur=dict()
    for nombre in range(1001):
    	compt=nb_deux(nombre)
    	if compt not in diviseur.keys():
    		diviseur[compt]=set()
    	diviseur[compt].add(nombre)
    # for
    print(diviseur)

    Et wiztricks n'a pas tort. On lit la doc d'un truc avant de l'utiliser. Même si on a l'impression de perdre son temps parce qu'on veut arriver vite au résultat, l'expérience montre qu'en réalité le temps pris à s'instruire est récupéré ensuite au centuple.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Membre confirmé
    Homme Profil pro
    Analyse système
    Inscrit en
    Juin 2018
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Alimentation

    Informations forums :
    Inscription : Juin 2018
    Messages : 180
    Par défaut
    Merci pour cet enseignement

Discussions similaires

  1. Comment évaluer combien de fois un algorithme est-il appelé ?
    Par AntoineCompagnie dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 24/12/2015, 16h22
  2. Vérifier si une variable est divisible par 10
    Par Snigz dans le forum Général Python
    Réponses: 4
    Dernier message: 05/04/2014, 17h04
  3. [AC-2003] combien de fois une valeur est-elle affichée ?
    Par sabredebois dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 18/12/2009, 15h34
  4. Réponses: 4
    Dernier message: 25/01/2008, 21h58
  5. [XSL]compter combien de fois la valeur d'1 attribut est prés
    Par klowlead dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 21/02/2006, 18h48

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