Partage
  • Partager sur Facebook
  • Partager sur Twitter

difficulte

    20 novembre 2020 à 3:01:10

    salut je suis debutant et je face une difficute. en effet j'essaye d'ecrire un programme en c qui demande a l'utilisateur d'entrer un nombre et par la suite affiche les diviseurs de ce nombre en question. merci d'avance
    • Partager sur Facebook
    • Partager sur Twitter
      20 novembre 2020 à 3:26:06

      Salut, quelle est ta difficulté? As-tu déjà essayé de faire un code?


      • Partager sur Facebook
      • Partager sur Twitter
        20 novembre 2020 à 3:40:34

        Bonjour, Merci d'écrire un titre en rapport avec votre problématique, et transmettez le code que vous avez écrit en utilisant le bouton code </> du forum affin de recevoir avis et aide par rapport à celui-ci.

        Mauvais titre

        Le titre est un élément important qui ne doit pas être négligé. N'oubliez pas cette règle simple : le titre idéal résume la question que vous allez poser en une petite phrase. Il doit permettre aux visiteurs de se repérer facilement dans le forum visité et d'identifier le sujet à sa seule lecture.

        Vous pouvez utiliser divers préfixes comme [Erreur], [MySQL], [Compatibilité], etc... Aussi, pensez à consulter les règles propres à chaque forum (visibles dans les topics épinglés en haut des sections).

        De plus, choisir un bon titre permet de rendre plus faciles les recherches des autres membres.

        Les titres de type "besoin d'aide" ou "problème" ne sont pas tolérés.

        Pour modifier votre titre, éditez le premier message de votre sujet.

        (titre originel : difficulte)

        Liens conseillés

        • Partager sur Facebook
        • Partager sur Twitter
          20 novembre 2020 à 3:56:14 - Message modéré pour le motif suivant : Merci d'utiliser le bouton code du forum pour insérer votre code


            20 novembre 2020 à 4:54:15

            Bon je n'ai pas l'expérience nécessaire pour dire ça mais.. Il y a un début à tout comme on dit.


            Ça serait mieux si tu utilisais "Code <>" pour que ce soit plus compréhensible mais on va faire avec.

            Déjà "int div" n'est pas correct, ce n'est pas une variable tu n'as donc pas à le déclarer. Ensuite, au lieu d'utiliser une boucle "while" je te conseille plutôt d'utiliser une boucle "for". Concernant tes variables, il est préférable qu'elles soient réel et non entier, donc "double" et non "int.", du coup dans ton printf tu auras plutôt "%lf". 

            Ensuite, tu mets comme instruction "si div = 0, écrire y" ce qui ne sert à rien.. Sachant que comme je l'ai dit div ne peut pas être utilisé comme variable.

            Très peu d'esthétisme dans ton code ce qui le rend peu lisible, je te conseille vraiment d'améliorer ça si tu veux que ça devienne lisible.

            Si tu ne comprends toujours pas, je peux te le faire en algo et tu auras juste à le traduire en C. 

            (Les expérimentés qui lisent ça.. si j'ai dit des bêtises ne me tapez pas).

            • Partager sur Facebook
            • Partager sur Twitter
              20 novembre 2020 à 8:21:49

              Et surtout if (div = 0) est une affectation et non une comparaison.
              • Partager sur Facebook
              • Partager sur Twitter
                20 novembre 2020 à 9:21:52

                @UlrichFossi Bonjour, Merci de modifier le titre de votre sujet comme demandé. ET

                Merci de colorer votre code à l'aide du bouton Code

                Les forums d'Openclassrooms disposent d'une fonctionnalité permettant de colorer et mettre en forme les codes source afin de les rendre plus lisibles et faciles à manipuler par les intervenants. Pour cela, il faut utiliser le bouton Code de l'éditeur, choisir un des langages proposés et coller votre code dans la zone prévue. Si vous utilisez l'éditeur de messages en mode Markdown, il faut utiliser les balises <pre class="brush: cpp;">Votre code ici</pre>.

                Liens conseillés

                • Partager sur Facebook
                • Partager sur Twitter
                  21 novembre 2020 à 4:11:40

                  @PqPas:
                  Pour trouver les diviseurs d'un nombre, il faut utiliser l'arithmétique entière.
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Le Tout est souvent plus grand que la somme de ses parties.

                    22 novembre 2020 à 4:30:27

                    Étant donné qu'il est peu intéressant de donner 1 et le nombre lui-même comme diviseurs, il vaut mieux chercher entre 2 et nombre/2 inclusivement.
                    En effet, si on suppose un diviseur supérieur à nombre/2 et inférieur à nombre, j'aurai:
                    nombre/2 < diviseur < nombre
                    nombre < diviseur*2
                    Il n'y a pas d'entier entre 1 et 2, ce qui nous amène à une contradiction.
                    On pourrait écrire:
                    for(int diviseur = 2; diviseur <= nombre/2; diviseur++)
                      if(nombre % diviseur == 0)  printf("%d\n", diviseur);
                    • Partager sur Facebook
                    • Partager sur Twitter

                    Le Tout est souvent plus grand que la somme de ses parties.

                      23 novembre 2020 à 7:37:40

                      Il semble que l'auteur du post original ne soit plus intéressé par la solution.
                      J'ajoute ce qui suit:
                      Supposons que le nombre pour lequel on cherche les diviseurs soit de l'ordre du milliard.
                      Il faudrait environ 500 millions d'itérations pour trouver les diviseurs de ce nombre.
                      Il serait beaucoup plus rapide de trouver ses facteurs premiers et leur fréquence respective.
                      Intuitivement, on peut penser que plus les facteurs sont grands, moins il y en a pour un nombre d'un ordre donné.
                      Considérons 2^30 qui est de cet ordre de grandeur.
                      Tout nombre ayant un facteur plus grand que 2 verra le nombre de facteurs diminuer (toujours pour cet ordre de grandeur).
                      Il faudra environ 30 itérations pour trouver tous les facteurs premiers et leurs fréquences.
                      Le nombre de diviseurs sera le produit des fréquences des facteurs plus un pour chaque fréquence.
                      Par exemple, si N = 2^28 * 3^1, il y aura (28+1) * (1+1) diviseurs (58).
                      (on considère le cas où le facteur apparaît 0 fois).
                      C'est un compteur circulaire avec un nombre différent de coches pour chaque niveau (facteur).
                      • Partager sur Facebook
                      • Partager sur Twitter

                      Le Tout est souvent plus grand que la somme de ses parties.

                        23 novembre 2020 à 8:40:26

                        PierrotLeFou a écrit:

                        Il semble que l'auteur du post original ne soit plus intéressé par la solution.
                        J'ajoute ce qui suit:
                        Supposons que le nombre pour lequel on cherche les diviseurs soit de l'ordre du milliard.
                        Il faudrait environ 500 millions d'itérations pour trouver les diviseurs de ce nombre.

                        Si tu cherches naïvement les diviseurs de N>3 alors tu peux te limiter à l'intervalle [1;sqrt(N)] car à chaque diviseur d que tu trouves dans cet intervalle va correspondre un unique diviseur N/d dans [sqrt(N),N]. Tu aboutis à un algorithme en O(n^.5) ce qui sera toujours meilleur que n'importe quel algorithme de factorisation entière. Un algorithme hybride pourrait prendre avantage à trouver les petits facteurs premiers de N. Le pire des cas restant la recherche de diviseurs d'un nombre premier.
                        Si on reprend ton ordre de grandeur en prenant pour exemple le nombre 1000773161, il faudra 31634 = sqrt(1000773161) itérations pour en trouver les 4 diviseurs.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          23 novembre 2020 à 18:39:17

                          Tu as raison. Je ne peux pas trouver d'autres diviseurs que k et N/k pour k de 2 à sqrt(N)
                          Pour 1000773161, je trouve 31627, 31643
                          et la recherche de ces deux facteurs premiers est aussi longue que de trouver naïvement les diviseurs. Avec de la chance, je pourrais sauter le second
                          PS Je l'ai fait en Python, pas en C ...
                          • Partager sur Facebook
                          • Partager sur Twitter

                          Le Tout est souvent plus grand que la somme de ses parties.

                          difficulte

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          • Editeur
                          • Markdown