Partage
  • Partager sur Facebook
  • Partager sur Twitter

[URGENT]Puissance de 2 sur python

Sujet résolu
    19 septembre 2019 à 21:08:41

    Bonjour,
    J'ai un devoir pour le lycée en python que je dois rendre lundi et impossible de le faire. Je compte sur votre aide.
    Le sujet :
    Ecrire un algorithme permettant de décomposer un entier non nul en somme de puissances de 2 distincte 2 à 2 ( justifier qu'il s’arrête). Par ex: 21 = 2^4 +2^2 +2^0.

    Ou j'en suis :
    n = int(input("Entier N "))
    i = 0
    Liste = []
    while (n != 0):
        while (2^i < n):
            i = i + 1
        i = i - 1
        n = n-2^i
        print (i)
        Liste.append(i)
        i = 0
    print(i)
    Liste[:]        
    

    L’idéal serai que j'arrive a mettre toutes les puissance dans une liste et que j'affiche cette liste. Mais c'est vraiment l'idéal.....
    Merci beaucoup a ceux qui méaideront
    n = int(input("Entier N "))
    i = 0
    Liste = []
    while (n != 0):
        while (2^i < n):
            i = i + 1
        i = i - 1
        n = n-2^i
        print (i)
        Liste.append(i)
        i = 0
    print(i)
    Liste[:]        
    
    

    -
    Edité par AnatoleBabin1 19 septembre 2019 à 21:19:34

    • Partager sur Facebook
    • Partager sur Twitter
      19 septembre 2019 à 21:32:43

      j'ai utilisé un dictionnaire pour les résultats mais si tu n'es pas familier avec fais juste 2 listes ou seulement celle que tu veux:

      chiffre = int(input("Nombre: "))
      
      puissance = 0
      
      resultat = {
      		'valeurs':[], 
      		'puissances':[]
      		}
      
      while chiffre:
      
      	puissance += 1
      
      	if 2 ** puissance > chiffre:
      		previous = 2**(puissance-1)
      		resultat['puissances'].append( puissance )
      		resultat['valeurs'].append( previous )
      		chiffre -= previous
      		puissance = 0
      
      
      print(resultat)

      Aussi un conseil, la programmation c'est pas des comme les maths sur papiers, tu peux te permettre de mettre des noms complets aux variables donc profite en ça t'eviteras d'une de te perdre et de deux de permettre une relecture facilité plus tard pour toi ou d'autres personnes

      -
      Edité par Coliculus 19 septembre 2019 à 21:43:03

      • Partager sur Facebook
      • Partager sur Twitter
        19 septembre 2019 à 22:16:59

        @Anatole sais tu faire la décomposition à la main ?

        Tu n'as pas besoin de deux while...

        • Partager sur Facebook
        • Partager sur Twitter
          19 septembre 2019 à 23:20:55

          Le problème est strictement équivalent à une conversion en base 2:

          n=2019
          
          L=[]
          p=1
          while n:
              q=n//2
              r=n%2
              if r:
                  L.append(p)
              p*=2
              n=q
          print(L, sum(L))
          [1, 2, 32, 64, 128, 256, 512, 1024] 2019

          et on a jamais besoin d'élever explicitement à la puissance deux (si le nombre est très très grand ayant par exemple des milliers de chiffres, recalculer dans une boucle des puissances de deux a un coût).

          Ta tentative de solution était aussi jouable même si un peu maladroite :

          n=2019
          Liste = []
          while (n != 0):
              i = 0
              while (2**i <= n):
                  i = i + 1
              i = i - 1
              n = n-2**i
              Liste.append(2**i)
          print(Liste, sum(Liste)) 
          [1024, 512, 256, 128, 64, 32, 2, 1] 2019


          La même idée aurait pu donner cela:

          n=2019
          k=0
          L=[]
          
          while 2**k<=n:
              k+=1
              
          p=2**(k-1)
          for i in range(k):
              if p<=n:
                  L.append(p)
                  n-=p
              p//=2
              
          print(L)

          mais ça reste moins simple que la conversion implicite en base 2.





          • Partager sur Facebook
          • Partager sur Twitter
            20 septembre 2019 à 18:50:57

            BOnjour merci pour vos reponse mais je n'ai pas compris, mon programme n'est pas bon? quest ce que je dois ajouter?

            • Partager sur Facebook
            • Partager sur Twitter
              20 septembre 2019 à 22:22:41

              AnatoleBabin1 a écrit:

              BOnjour merci pour vos reponse mais je n'ai pas compris, mon programme n'est pas bon? quest ce que je dois ajouter?


              Ton programme ne marche pas tel quel, comme tu peux le voir toi-même (ton i devient négatif et ton calcul de puissance de 2 est incorrect), je l'ai modifié pour qu'il marche, regarde mon 2e code ci-dessus.
              • Partager sur Facebook
              • Partager sur Twitter
                21 septembre 2019 à 0:24:08

                Pour s'amuser,

                '+'.join(['2**{}'.format(i) for i, v in enumerate(reversed(bin(21))) if v=='1']) 


                '2**0+2**2+2**4'

                • Partager sur Facebook
                • Partager sur Twitter

                Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                  21 septembre 2019 à 0:28:41

                  Plus court + plus fast :

                  "+".join(f"2^{i}" for i, v in enumerate(bin(21)[::-1]) if v=="1")


                  (join supporte très bien les générateurs)

                  • Partager sur Facebook
                  • Partager sur Twitter
                    21 septembre 2019 à 9:22:00

                    PascalOrtiz a écrit:

                    AnatoleBabin1 a écrit:

                    BOnjour merci pour vos reponse mais je n'ai pas compris, mon programme n'est pas bon? quest ce que je dois ajouter?


                    Ton programme ne marche pas tel quel, comme tu peux le voir toi-même (ton i devient négatif et ton calcul de puissance de 2 est incorrect), je l'ai modifié pour qu'il marche, regarde mon 2e code ci-dessus.


                    merci , je viens d'essayer tout marche. je suis un peu chiant mais bn'y a t-il pas moyen qu'il afiche 2^3 et non 8?

                    thelinekioubeur a écrit:

                    Plus court + plus fast :

                    "+".join(f"2^{i}" for i, v in enumerate(bin(21)[::-1]) if v=="1")


                    (join supporte très bien les générateurs)

                    Merci , c'est ce que je souhaite faire mais ou doi-je le mettre? peux-tu m'expliquer rapidemement comment sa marche?

                    -
                    Edité par AnatoleBabin1 21 septembre 2019 à 9:24:57

                    • Partager sur Facebook
                    • Partager sur Twitter
                      21 septembre 2019 à 9:54:28

                      AnatoleBabin1 a écrit:


                      merci , je viens d'essayer tout marche. je suis un peu chiant mais bn'y a t-il pas moyen qu'il afiche 2^3 et non 8?


                      Non, ce n'est pas possible en Python standard (à moins de surcharger l'opérateur xor ^ mais je ne pense que pas que ce soit possible pour des classes built-in).


                      AnatoleBabin1 a écrit:



                      Plus court + plus fast :

                      "+".join(f"2^{i}" for i, v in enumerate(bin(21)[::-1]) if v=="1")


                      (join supporte très bien les générateurs)

                      Merci , c'est ce que je souhaite faire mais ou doi-je le mettre? peux-tu m'expliquer rapidemement comment sa marche?


                      C'est basé sur la conversion en base 2 que Python te donne gratuitement avec sa fonction bin, les puissances de 2 recherchées correspondant aux chiffres 1 de l'écriture en base deux et dont on connait la position en parcourant la chaîne (à l'envers) avec enumerate. Si tu souhaites avoir un affichage équivalent, tu peux aussi y arriver ta solution en la modifiant légèrement (tu mémorises la liste des exposants i des puissances de 2 et tu affiches ensuite).
                      • Partager sur Facebook
                      • Partager sur Twitter
                        21 septembre 2019 à 10:18:27

                        Les codes en une ligne on a dit que c'était pour s'amuser ! Pour ton devoir prend plutôt la solution de Pascal
                        • Partager sur Facebook
                        • Partager sur Twitter
                          21 septembre 2019 à 11:10:53

                          thelinekioubeur a écrit:

                          Plus court + plus fast :

                          "+".join(f"2^{i}" for i, v in enumerate(bin(21)[::-1]) if v=="1")


                          (join supporte très bien les générateurs)

                          Merci , c'est ce que je souhaite faire mais ou doi-je le mettre? peux-tu m'expliquer rapidemement comment sa marche?

                          Traceback (most recent call last):

                            File "C:\Users\xxx/xxx.py", line 10, in <module>

                              print(Liste, sum(Liste)+ '+'.join(['2**{}'.format(i) for i, v in enumerate(reversed(bin(21))) if v=='1']))

                          TypeError: unsupported operand type(s) for +: 'int' and 'str'

                           voila l'erreur affiche quand je le mets apres mon print

                          • Partager sur Facebook
                          • Partager sur Twitter
                            21 septembre 2019 à 11:20:08

                            Je t'ai dis de ne pas utiliser ce code je ne vais plus te répondre moi :ninja:
                            • Partager sur Facebook
                            • Partager sur Twitter
                              21 septembre 2019 à 11:47:57

                              thelinekioubeur a écrit:

                              Les codes en une ligne on a dit que c'était pour s'amuser ! Pour ton devoir prend plutôt la solution de Pascal

                              2^x=y et bien sa m'affiche le y et je voudrait le x moi.... Mais je  comprends pas quand je mets la ligne"pour s'amuser" ;) dans mon print sa me sors une erreur ( regardez mon msg précèdent)



                              • Partager sur Facebook
                              • Partager sur Twitter
                                21 septembre 2019 à 11:52:48

                                Parce que ça s'utilise comme ça :

                                print("+".join(f"2^{i}" for i, v in enumerate(bin(21)[::-1]) if v=="1"))

                                Et tu remplace 21 par le nombre que tu veux.

                                C'est ton sum(Liste) qui plante ...

                                • Partager sur Facebook
                                • Partager sur Twitter

                                [URGENT]Puissance de 2 sur python

                                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                • Editeur
                                • Markdown