Partage
  • Partager sur Facebook
  • Partager sur Twitter

Algo de maths

Sujet résolu
    2 novembre 2006 à 10:06:26

    Bonjour, en spécialité Maths en Terminale S, on me demande de creer un programme sur ma calculette (Casio) en me donnant ces instructions :

    -Demander A
    -Si A=2 ou A = 3 ou A = 5, alors A est premier et fin
    -Pour N = 2 et N = 3
    -Si N divise A alors A non premier et fin
    -N = 5
    -Faire si N divise A alors A est non premier et fin
    sinon augmenter N de 2
    tant que N <= racine de A
    A premier

    Avant de le faire sur ma calculette j'ai souhaité le faire en C dans une fenetre dos.
    Cependant je bloque au niveau de :

    <citation nom="">-Pour N = 2 et N = 3
    -Si N divise A alors A non premier et fin</citation>

    Voici mon code C :

    #include <stdio.h>
    #include <stdlib.h>

    int main(int argc, char *argv[])
    {
      float a = 0;
      printf("Vérifier qu'un nombre A est premier :\n\n");
      printf("A = ");
      scanf("%f", &a);
      if (a == 2 || a == 3 || a == 5)
      {
            printf("A est un nombre premier\n");
      }
      else
      {
          long n;
          float a_sur_n = a/n;
            for (n = 2 ; n <= 3 ; n++)
            {           
                if(a_sur_n == (int) a_sur_n)
                {
                           printf("A n'est pas un nombre premier car il est divisible par %ld \n", n);
                           break;
                }
            }
      }
     

      system("PAUSE");     
      return 0;
    }


    Si quelqu'un avait une petite idée de mon erreur sachant que le C n'est pas mon langage de prédiléction :$

    merci d'avance ;)
    • Partager sur Facebook
    • Partager sur Twitter
      2 novembre 2006 à 10:14:14

      Le mieux c'est de faire ainsi:
      for (n = 2 ; n <= 3 ; n++)
      {
      if((a%n)==0)
      {
      En effet, l'opérateur % renvoie le reste de la division(eucliedienne) donc si le reste est nul, il est divisible .
      Au passage, ton code ne marche pas parce que tu initialie a_sur_n avant de connaître la valeur de n .
      • Partager sur Facebook
      • Partager sur Twitter
        2 novembre 2006 à 10:16:41

        Alors moi j'ai deja fait ce petit programme.

        Quand on dit on a N=2 et N=3
        Si N divise A, alors A n'est pas premier

        Cette expression peu etre traduite par le modulo, si A est divisible pas N alors le reste de la division est nul alors A%N = 0. Ensuite c'est toi qui fait la condition, Si tu coince regarde mon programme

        je te le montre mais en caché comme ca tu n'est pas obligé de le lire

        Secret (cliquez pour afficher)
        #include <stdio.h>
        #include <stdlib.h>
        #include <math.h>

        int main(int argc, char *argv[])
          {
          int nombre = 0, diviseur = 5, premier = 0;
         
          printf("Entrez le nombre : ");
          scanf("%d", &nombre);
         
          //Si le nombre = a 2 , 3, 5 il est premier
          if(nombre == 2 || nombre == 3 || nombre == 5)
            premier = 1;
         
          //Si le nombre est divisible par 2 ou 3 alors il n'est pas premier
          else if((nombre % 2) == 0 || (nombre % 3) == 0)
            premier = 0;
         

          //Sinon N = 5
          else
            {
            //tant que N <= racine de A
            do{
              //Si A n'est pas divisible par N il est premier
              if((nombre % diviseur) != 0)
                {
                premier = 1;
                break;
                }
              //Sinon N +2
              else
                diviseur += 2;
              }while(nombre <= sqrt(nombre));
            }
         
         
          if(premier)
            printf("C'est un nombre premier\n");
          else
            printf("Ce n'est pas un nombre premier\n");
           
           
          system("PAUSE");     
          return 0;
          }
        • Partager sur Facebook
        • Partager sur Twitter
          2 novembre 2006 à 10:20:02

          Ah merci je n'avais pas pensé au modulo.

          Cependant en mettant ce que tu m'indiques :

          #include <stdio.h>
          #include <stdlib.h>

          int main(int argc, char *argv[])
          {
            float a = 0;
            printf("Vérifier qu'un nombre A est premier :\n\n");
            printf("A = ");
            scanf("%f", &a);
            if (a == 2 || a == 3 || a == 5)
            {
                  printf("A est un nombre premier\n");
            }
            else
            {
                long n;
                  for (n = 2 ; n <= 3 ; n++)
                  {           
                      if((a%n)==0)
                      {
                                 printf("A n'est pas un nombre premier car il est divisible par %ld \n", n);
                                 break;
                      }
                  }
            }
           

            system("PAUSE");     
            return 0;
          }


          merci

          PS: dark-lord je vais essayer de trouver seul ensuite je regarderai ton code si je n'y arrive pas ;p merci
          • Partager sur Facebook
          • Partager sur Twitter
            2 novembre 2006 à 10:21:07

            Salut,

            1) Pourquoi A est-il un flottant ? o_O Un entier serait à mon avis plus approprié ( sachant qu'il est absurde de faire des comparaisons == avec un nombre flottant, car c'est une approximation ).

            2) Dans ta boucle for, n ne prendra que la valeur 2, car après incrémentation, n = 3 donc n<=3, la boucle n'est donc pas exécutée.

            3) Si comme suggéré en 1) A est un entier, tu pourra utiliser l'opérateur %, c'est plus joli à lire que le bidouillage que tu fait (même si c'est bien entendu correct)

            ->pamaury : l'usage de l'opérateur % avec un flottant est interdit (d'ailleurs le compilateur le refuse).
            • Partager sur Facebook
            • Partager sur Twitter
              2 novembre 2006 à 10:23:11

              euh oui d'ailleurs je n'avais pas vu que c'était un flottant . C'est totalement absurde de parler de primalité avec un flottant !!!!
              • Partager sur Facebook
              • Partager sur Twitter
                2 novembre 2006 à 11:03:33

                ok merci à vous. Ayant appris la programmation en PHP le typage des variables reste laborieux pour moi :$
                Cependant pour revenir au programme je ne peux pas utiliser le modulo car cette opération n'existe pas sur ma casio donc je prefere le faire comme j'avais fait dans mon code en C.

                Merci a tous ;)
                • Partager sur Facebook
                • Partager sur Twitter
                  2 novembre 2006 à 12:29:24

                  Juste pour ton information c'est pas parce que ca existe pas que tu peux pas l'ecrire c'est vite fait

                  A - (int(A/B) * B) ->R

                  Et hop ta ton modulo
                  • Partager sur Facebook
                  • Partager sur Twitter
                    3 novembre 2006 à 10:52:09

                    Salut j'ai essayé de realiser ce programme sur ma super Calto
                    et je pense y etre arriver , mais je ne suis pas passé par le modulo, j'ai plutot essayé de bidouiller un peu mais au final sa marche ^^:D

                    Voici mon code (que je meme en secret ou qu'a ou il voudrait le realiser tout seul sans regarder sur les autres ;) )
                    Secret (cliquez pour afficher)

                    Lbl 0
                    ClrText
                    "LE NOMBRE A VAUT "?->A
                    If A=2 Or A=3 Or A=5
                    Then Locate 1,3,A
                    Locate 3,3,"EST PREMIER"
                    Fore 1->X To 1000
                    Next
                    Goto 0
                    Ifend
                    ClrText
                    2->N
                    3->M
                    "POUR N=2 OU N=3:"
                    A/N->O
                    A/M->Q
                    Frac O->P
                    Frac Q->R
                    If P=0 Or R=0
                    Then "A N EST PAS PREMIER"
                    For 1->X To 1000
                    Next
                    Goto 0
                    IfEnd
                    If P!=0 Or R!=0
                    Then For 1->X To 500
                    Next
                    Clrtext
                    "POUR N=5:"
                    5->G
                    Lbl 1
                    A/G->H
                    Frac H->I
                    If I=0
                    Then "A N EST PAS PREMIER"
                    For 1->X To 1000
                    Next
                    IfEnd
                    If I!=0
                    Then G+2->G
                    "N="
                    G(petit triangle noir dans Shift+Vars)
                    If G>racineA
                    Then ClrText
                    Locate 1,1,A
                    Locate 4,1,"EST PREMIER"
                    For 1->X To 1000
                    Next
                    IfEnd
                    If G<=racineA
                    Then Goto 1
                    IfEnd
                    IfEnd


                    Voila, pouvez vous me dire ce que vous en pensé :p !
                    Merci ++ ^^
                    • Partager sur Facebook
                    • Partager sur Twitter

                    Algo de maths

                    × 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