Partage
  • Partager sur Facebook
  • Partager sur Twitter

Programme nombre sympathique langage C

Problème a l'affichage

Sujet résolu
    16 octobre 2019 à 21:41:14

    Bonjour/Bonsoir, 

    Je vous explique rapidement le sujet et le problème que je rencontre : Le but est de créer un programme en langage C qui afficher tout les nombres sympathique dans un intervalle a et b saisis. Un nombre sympathique est un nombre qui contient autant de chiffres paires que impaires (exemple = 1001)

    J'ai donc réussi a faire ce programme : 

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        int a;
        int b;
        int n;
        int pair = 0;
        int impair = 0;
        int n2;
        int r;
        int last = 0;
    
    
        printf("Saisissez a : ");
        scanf("%d", &a);
    
        printf("Saisissez b : ");
        scanf("%d", &b);
    
        for (n=a; n<=b; n++)
        {
            n2=n;
            while (n2!=0)
            {
                r=n2%10;
                if (r%2==0)
                {
                    pair++;
                }
                else if (r%2==1)
                {
                    impair++;
                }
                n2=n2/10;
            }if (pair == impair)
            {
                    printf("%d ", n);
            }pair = 0;
            impair = 0;
            }
    return 0;
    }

    MAIS , MAIS il veut que l'affichage soit de la manière suivante : un "et" doit etre placé entre les deux derniers nombre sympathiques

    Exemple on saisit a = 1001 et b=1005, on doit avoir 1001, 1003 et 1005 à l'affichage. Le tout sans utiliser de tableau ni chaine de caractères :)

    Si quelqu'un a une idée svp Merci 

    • Partager sur Facebook
    • Partager sur Twitter
      17 octobre 2019 à 5:19:51

      Salut,
      Tu pourrais ajouter une variable `count' qui compte les `printf'.
      Tu mets un `switch' juste devant le `printf'
      Si c'est 0, tu n'imprimes rien, si c'est un tu imprimes ", " et si c'est 2, tu imprimes " et ".
      Tu augmentes le `count' juste après le `printf'.
      Remplaces "%d " par "%d".
      Quelqu'un a une meilleure idée?
      • Partager sur Facebook
      • Partager sur Twitter

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

        17 octobre 2019 à 15:11:03

        Salut Pierrot, ducoup ce que tu dit est vrai et marche mais sa marche uniquement lorsqu'il y a que 3 nombres sympathique or dans mon cas a et b seront saisies par le prof ducoup l'intervalle est inconnu. Il me faudrait un truc qui marche quelque soit l'intervalle...
        • Partager sur Facebook
        • Partager sur Twitter
          17 octobre 2019 à 15:25:04

          Salut,
          Je n'ai pas assez analysé ton code. Peux-tu savoir si tu es rendu au dernier?
          Je l'ai testé avec a=1001 et b=1234 et je suis tombé dans une boucle infinie, je dépassais les 2000.
          L'idée reste la même, tu remplaces le `switch' par un ou des `if' appropriés.
          • Partager sur Facebook
          • Partager sur Twitter

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

            17 octobre 2019 à 15:34:21

            Je suis dessus depuis hier soir mais même avec ce que tu me dit je ne peux pas savoir quelle est le dernier nombre sympathique pour mettre le 'et' juste avant, pourrais tu me détailler un peu plus sur ce que je dois faire stp ?
            • Partager sur Facebook
            • Partager sur Twitter
              17 octobre 2019 à 18:32:53

              Dans ton premier message, tu ne dis pas si tu as droit aux appels de fonctions.
              Voici une piste de solution.
              Tu te fais une fonction qui dit si le nombre courant est sympathique ou non.
              Ensuite, tu teste si b est sympathique avant la boucle. Si ce n'est pas vrai, tu fais `b=b-1' avant la boucle.
              En fait, tu recules jusqu'à ce que b soit sympathique ou inférieur à a. Exemple:
              while (b>=a && !sympathique(b)) b--;
              Ta boucle se trouvera allégée par le fait même.
              Comme je suggère d'imprimer ", " par défaut AVANT le nombre (sauf si count=0), tu teste si `n==b' et dans ce cas, tu imprimes " et " à la place.
              Dans ton code de départ, tu ne pouvais pas le faire car tu ne savais pas si b était sympathique.
              En passant, b=1234 ne donne pas de boucle infinie, c'est une erreur d'interprétation, les nombres étaient collés après ma correction.
              • Partager sur Facebook
              • Partager sur Twitter

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

                17 octobre 2019 à 20:44:19

                Je ne suis pas expert mais voilà une idée :

                Stocker tes nombres corrects dans un tableau créé avec malloc et le redimensionner au besoin avec realloc. Si realloc ne marche pas, faire un nouveau malloc plus gros, copier le premier tableau dedans et supprimer ce dernier ensuite avec free ?

                Tu n'as ensuite plus qu'à faire une boucle et t'arrêter à l'avant dernier élément.

                Bon, c'est une idée à tester, je ne garantis pas que c'est la meilleure solution.

                Edit : A noter que le if (r % 2 == 1) ne sert à rien car c'est mutuellement exclusif. Si le nombre n'est pas pair, il est forcément impair.

                2ème edit : Je n'avais pas vu qu'il ne fallait pas utiliser de tableau. Désolé. Mon idée est invalide.

                -
                Edité par flashjaysan 17 octobre 2019 à 20:49:45

                • Partager sur Facebook
                • Partager sur Twitter
                  17 octobre 2019 à 21:10:10

                  Yep bien vue pour le if (r%2==1) je vais le retirer, le programme a été résolu sans tableau mais merci de ton aide !
                  • Partager sur Facebook
                  • Partager sur Twitter
                    17 octobre 2019 à 22:50:11

                    Salut,
                    @flashjaysan:
                    Utiliser malloc et realloc semble facile à première vue mais une gestion efficace est moins évidente.
                    On ne fait pas un malloc d'un item et realloc à chaque ajout.
                    C'est toujours un compromis entre demander beaucoup au début et ajouter souvent.
                    Parfois, il faut concevoir un algorithme qui s'adapte à la situation.
                    Dans ce cas-ci, on aurait pu approximer le malloc à la moitié de la différence entre a et b.
                    • Partager sur Facebook
                    • Partager sur Twitter

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

                      17 octobre 2019 à 22:59:21

                      Oui, je me doutais qu'une allocation d'espace approchée serait plus efficace qu'une allocation à chaque ajout. Mais tu as raison de le souligner. Merci.

                      Ton idée de prendre la moitié de la différence entre a et b est une bonne base de travail. Idéalement, il faudrait faire une estimation de la fréquence d'apparition de nombres sympathiques (ça doit pouvoir se faire je pense par raisonnement logique) afin d'estimer le nombre potentiel d'occurrences dans une fourchette donnée.

                      • Partager sur Facebook
                      • Partager sur Twitter
                        18 octobre 2019 à 1:07:42

                        Comme je l'ai mentionné à SelimYasar, j'ai testé de 1001 à 1234.
                        Ce que je remarque, c'est qu'on en a 5 par dizaine, et on alterne d'une dizaine à l'autre:
                        1001 ... 1009, 1010, 1012 ... 1018, 1021, 1023 ... 1029, 1030, ... 1038, 1041 ...
                        Je ne sais pas si ça se démontre de façon mathématique mais c'est intuitivement correct.
                        • Partager sur Facebook
                        • Partager sur Twitter

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

                          18 octobre 2019 à 7:12:18

                          Déjà, on peut éliminer les nombre à "nombre" de chiffres impairs. Pour les autres, on peut partir du nombre de chiffres et tester les chiffres pairs. S'ils sont en nombre différent de la moitié du nombre de chiffre, on peut déjà s'arrêter de tester.

                          L'exercice est intéressant. :)

                          • Partager sur Facebook
                          • Partager sur Twitter
                            18 octobre 2019 à 8:05:29

                            J'ai trouvé un intervalle plus dispersé.
                            Aprèes 1988, je ne trouve rien avant 2011, je me trompe?
                            C'est clair que le nombre de chiffres doit être pair: 2, 4, 6, ...
                            Pour un nombre de 4 chiffres le premier va de 1 à 9, les autres 0 à 9, donc 9000 possibilités.
                            Mon analyse combinatoire est loin. Je peux dire que le nombre de chiffres pairs sur le premier est 4 contre 5 pour les chiffres impairs.
                            Reste à calculer le nombre de possibilités valides ou invalides.
                            Si le premier est impair (5 choix), je veux un autre impair (5 choix), et 2 pairs (5 choix chacun).
                            ça devrait donner 5*5*5*5 fois le nombre de permutations des 3 derniers, soit 3! = 6 = 3750 (dixit Google).
                            Pour les nombres pairs, je remplace le premier 5 par 4, j'obtient 3000.
                            Au total: 6700
                            Corrigez-moi si ma logique est fausse ...
                            Ça peut manquer sur les permutations ... si tu permutes 2 '0' ça ne compte pas.
                            • Partager sur Facebook
                            • Partager sur Twitter

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

                              18 octobre 2019 à 9:11:10

                              Oui, je trouve aussi 2011 après 1988.

                              J'ai eu du mal à comprendre ton message. Il vaudrait mieux parler (comme pour les bits) de chiffres "le plus significatif" plutôt que de "premier".

                              Ah oui ! Bien vu, le chiffre le plus significatif ne peut pas valoir 0 ! Donc par conséquent, on ne peut que tester des nombres dans l'ensemble N*.

                              Selon un certain nombre de chiffre, le nombre de possibilités de combinaisons est de 9 * 10^(nombreDeChiffre -1).

                              Fait amusant, la définition d'un nombre "sympathique" semble sujet à débat :

                              • On considère un nombre n entier positif. Si on peut réarranger les nombres entre 1 et n pour former une suite u1,....,un telle que la somme d'un terme de la suite et et de son successeur, est toujours un carré parfait, alors le nombre n est dit sympathique.
                              • Un nombre est sympathique si tous ses chiffres sont différents et s'il est multiple de la somme de ses chiffres.

                              J'ai de très nébuleux souvenirs des maths combinatoires. Je ne peux donc dire si ton raisonnement est bon. Je manque de rigueur en maths pures. :)

                              6750 (3750 + 3000) nombres sympathiques sur 9000 possibilités à 4 chiffres, ça fait pas mal quand même.

                              • Partager sur Facebook
                              • Partager sur Twitter
                                18 octobre 2019 à 14:27:33

                                Si les 3 chiffres à permuter étaient différents, mon raisonnement serait correct mais il y a des doublons possibles comme j'ai dit.

                                ça je ne sais pas comment l'exprimer.

                                • Partager sur Facebook
                                • Partager sur Twitter

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

                                Programme nombre sympathique langage C

                                × 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