programme nombre premier en c

Le problème exposé dans ce sujet a été résolu.

Bonjour, Je suis votre tutoriel de c et il se trouve que je ne comprend pas trop la réponse pour le programme qui détermine si le nombre est premier ou pas. Avant de regarder j'avais essayé de faire un code qui se base sur la propriété si un nombre x est divisible par y alors le résultat de l’opération x % y est nul. j'avais donc mis les conditions suivantes

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
int main(int argc, char **argv)
{   int x=0;
    printf("entrer un nombre premier \n");
    scanf("%d",&x);
    while( ((x%1)== 0) && ((x%x)== 0) && (x%(2)!=0) && ((x%(3)!=0) ))
    {
        printf("le nombre %d est premier \n",x);
        break; 

    }
    return 0;
}

Voila je ne voit pas trop quoi rajouter pour l'améliorer

merci d'avance

+0 -0

while( ((x%1)== 0) && ((x%x)== 0) && (x%(2)!=0) && ((x%(3)!=0) ))

signifie textuellement "tant que x est divisible par 1, par lui même et pas par 2 ni 3"

Donc si tu entres "25" par exemple, il te dira "le nombre 25 est premier" en effet 25 est divisible par 1, par lui même mais pas par 3.

puis sortira de la boucle.

On a donc un comportement assez étrange : tu sors de la boucle tout de suite.

Le test de X divisible par 1 et par lui même ne sert à rien : tous les nombres sont divisibles par 1 et par eux mêmes.

Ensuite, le principe naïf est de tester un par un tous les diviseurs inférieur au nombre (ou à la racine carré du nombre) et de dire "il n'est pas premier" si tu trouves un diviseur.

PS : j'ai corrigé ton message pour mettre la coloration syntaxique : il faut que tu mettes un retour à la ligne entre les trois antiapostrophe et le code. En effet les caractères qui suivent les trois antiapostrophes permettent de dire de quel langage on parle (dans ton cas le C)

+1 -0

L'algorithme que tu présentes est super bizarre, et faux. Pourquoi tu boucles sur une condition invariante pour ressortir juste après ? Pourquoi tu testes si x est premier avec lui-même ? C'est effectivement avec l'opérateur reste que tu dois procéder, mais c'est la structure de base de ton algo qui est fausse.

Pour t'aiguiller, on dit que $x$ entier naturel non nul est premier si et seulement si c'est 1 ou si pour tout entier entre 1 et $x$ exclu cet entier ne divise pas $x$.

Maintenant que je t'ai donné une piste, essaie d'écrire le pseudocode correspondant à cet algorithme. Ne le code pas avant d'avoir tout mis au clair sous forme de pseudocode, ça aide à comprendre ce qu'on fait.

Me suis fait griller mais je poste quand même au cas où ça t'aide.

+1 -0

C'est pour ça qu'on est là. COmme le dit très bien le tutoriel de C++ que je suis en train de relire, la programmation c'est de la logique et de la patience. Quand tu as des problèmes de logique, demander à quelqu'un c'est le meilleur moyen de les comprendre.

Autre technique, c'est la technique de la peluche : raconte ton algo à une peluche, tu te rendras compte des problèmes qu'il contient.

Autre technique : essaie plusieurs valeurs éloignée les unes des autres.

Salut,

Je suis votre tutoriel de c et il se trouve que je ne comprend pas trop la réponse pour le programme qui détermine si le nombre est premier ou pas.

electronsource75

La réponse donnée dans le cours (chapitre sur les boucles) utilise un algorithme naïf et peu efficace, mais qui a le mérite d'être simple et de présenter la logique d'une boucle : le corps est exécuté tant que l'indice (qui commence à deux, puisque tous les nombres sont multiples de un) est inférieur au nombre entré. Dans le cas où un de ceux-ci est un diviseur du nombre fourni par l'utilisateur (autrement dit, si le reste de la division entière est non nul), alors c'est qu'il n'est pas premier. Sinon, c'est qu'il est premier.

+0 -0

Voilà un algorithme qui traite le problème de la détermination des nombres premier, sous forme d’une boucle, le programme demande chaque fois à l’utilisateur comme input un entier et il affiche comme output si le nombre est premier ou non, si l’utilisateur saisie une valeur négative, le programme affiche un message d’erreur et quitte la boucle.

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

int main()
{
  int n,x=0;
 do{  
     printf("Entrer un nombre entier : ");
     scanf("%d",&n);
    if(n<0)
    {
        printf("\nError !....");
        EXIT_SUCCESS;
    }
    else
    if(n==0 || n==1)
    {
          printf("\n%d n'est pas premier\n\n",n);
    }
    if(n>=2)
    {
        if(n==2)
        {
            printf("\n%d est premier \n\n",n);
        }
        else 
        if(n>2)
        {
            for(int i=2;i<n;i++)
            {
                if(n%i==0)
                {
                    printf("\n%d n'est pas premier\n\n",n);
                    break;
                }
                else
                if(n%i!=0)
                {
                    if(i==n-1)
                    {
                        printf("\n%d est premier\n\n",n);
                        break;
                    }
                    else
                        continue;
                }
            } 
        }
    }
   }while(n>=0);
    return 0;
}

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte