IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Algorithme d'un nombre premier


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mars 2014
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2014
    Messages : 29
    Points : 16
    Points
    16
    Par défaut Algorithme d'un nombre premier
    Bonjour,

    J'ai une deuxième question : pourriez-vous m'aider car je n'arrive pas à trouver le bon algorithme
    pour déterminer les nombres premiers. Voila comment je procède. Un nombre premier est divisible par
    1 et par lui-même donc si il n'est divisible par les nombres entre ces 2 bornes si je peux dire ça
    alors il est premier.

    Voici mon programme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
     
    int main()
    {
        int nbr, i;
        printf("\nEs ce qu'un nombre est premier ou pas.\n\nSi oui alors renvoie le chiffre 1.\n");
        printf("\nEntrez la valeur de n = ");
        scanf("%d", &nbr);
     
      for (i=2; i<nbr; i++);
      nbr%i;
     
      if (nbr%i==0)
        {
            printf("\nLe nombre est premier.\n");
        }
      else
        {
            printf("\nLe nombre n'est pas premier.\n");
        }
        return 0;
    }

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ta boucle for n'a pas de corps.
    Et la ligne qui suit ta boucle for vide n'a pas d'effet.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mars 2014
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2014
    Messages : 29
    Points : 16
    Points
    16
    Par défaut
    Désolée de demander ça mais c'est quoi MP.
    Je suis technicien électromécanicien et je suis des cours
    du soir pour devenir ingénieur.

    Et j'ai un cour d'informatique.
    Je n'ai jamais fait d'informatique.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (i=2; i<nbr; i++);
    {  
        nbr%i;
    }
    voici le changement que j'effectue mais c'est seulement le if qui fonctionne et pas le else.
    comment faire
    quelqu'un pourrais t il m’aider.
    Merci d'avance Kumral

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Kumral Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
      for (i=2; i<nbr; i++);
      {  
         nbr%i;
      }
    voici le changement que j'effectue mais c'est seulement le if qui fonctionne et pas le else.
    comment faire
    quelqu'un pourrais t il m’aider.
    Merci d'avance Kumral
    Bonjour
    Tu calcules nbr%i mais le résultat de ce calcul est perdu (ni récupéré, ni évalué).

    Tu es dans un cas classique "vérifier si tous les éléments d'un ensemble correspondent à une certaine caractéristique", à savoir "tous les nombres entre 2 et nbr-1 ne divisent pas nbr"

    La procédure est la suivante: tu présupposes que la caractéristique est vérifiée et tu cherches si un seul élément ne la vérifie pas. Donc te faut positionner une variable spéciale à "vrai" (la variable qui déterminera au final si la caractéristique de l'ensemble y est ou pas), puis tu cherches si un des "i" divise nbr. Si c'est le cas, alors tu changes la variable spéciale et tu la mets à "faux".

    En fin de boucle, si la variable est à "vrai" alors le nombre est premier, si elle est à "faux" alors il ne l'est pas.

    Pour optimiser un petit peu: si tu trouves un diviseur, alors quand tu mets la variable à "faux" tu peux aussi arrêter la boucle (break) puisque de toute façon ton nombre n'est pas premier.

    Autre optimisation: si le résultat de la division nbr / i devient plus petit que "i", alors tu peux aussi arrêter la boucle car tu es certain que le nombre est premier. Donc au lieu de boucler jusqu'à nbr, tu peux boucler jusqu'à racine_carrée(nbr).

    Autre optimisation: mis à part 2, tous les diviseurs éventuels sont impairs. Donc tu peux tester 2 à part puis ensuite boucler à partir de 3 et incrémenter de 2 en 2

    Sinon pour ton autre question, "MP" veut dire "Message Privé" mais il s'agit de la signature de Médinoc et donc cette phrase ne s'adressait pas à toi spécialement.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Kumral Voir le message
    Désolée de demander ça mais c'est quoi MP.
    Je suis technicien électromécanicien et je suis des cours
    du soir pour devenir ingénieur.

    Et j'ai un cour d'informatique.
    Je n'ai jamais fait d'informatique.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (i=2; i<nbr; i++);
    {  
        nbr%i;
    }
    voici le changement que j'effectue mais c'est seulement le if qui fonctionne et pas le else.
    comment faire
    quelqu'un pourrais t il m’aider.
    Merci d'avance Kumral
    Bonjour.

    Pour que ta boucle fonctionne il faut enlever le";" à la fin de celle-ci. Si tu le laisse le code entre { } ne sera exécuté qu'une seule fois.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mars 2014
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2014
    Messages : 29
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par gerald3d Voir le message
    Bonjour.

    Pour que ta boucle fonctionne il faut enlever le";" à la fin de celle-ci. Si tu le laisse le code entre { } ne sera exécuté qu'une seule fois.
    Merci de votre aide,

    Kumral

  7. #7
    Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2018
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    #include <stdio.h>
    #include <stdlib.h>
     
     
     
    	int main(){
     
     
    		int etat,i,n;
     
    			begin:
     
    			printf("Entrer Le nombre n :\n");scanf("%d",&n);
    		//Le 1 est un nombre non premier
    			if(n==1){
    				printf("Non Premier\n");}
    		//Le 2 est un nombre premier
    			if(n==2){
    				printf("Premier\n");}
     
    		//Ne veux pas diviser par 1 et le nombre lui méme c'est pour ça on a initialize le variable i par 2
    			i=2;
    		//Diviser Jusqu'a (n-1) pour ne pas diviser le nombre lui méme
    			while(i<n){
    				etat = n%i;
    		// ici si le moudulo equal 0 malgé je suis éliminé les deux cas [1 et le nombre lui méme] il ya un autre nombre qui accepte la division si pour ça je dis que le nombre n'est pas premier
    			if(etat == 0){
    				printf(" Non Premier \n");
    				break;
    			}else{
    				printf("Premier \n");
    				break;
    			}
     
    			i++;
     
     
     
     
     
    		}
     
    		//Pour ne pas fermer la console a chaque fois que  je veux tester mon programme
    			goto begin;
     
     
     
     
     
    		//vraiment chui désolé car mon français c'est pas bien mais j'essayé d'écrit ces commentaires 
     
     
     
     
    	return 0;
    }

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par belaabda97 Voir le message
    //vraiment chui désolé car mon français c'est pas bien mais j'essayé d'écrit ces commentaires
    Pas de souci. Merci de tes efforts. Bien vu aussi de noter que 1 n'est pas premier (beaucoup font l'erreur).

    Maintenant le principal souci de ton algorithme c'est que tu testes un diviseur (par exemple 3) et tu dis "si la division fonctionne alors le nombre est premier sinon il ne l'est pas et de toute façon quoi qu'il arrive j'arrête de tester les autres nombres" (ici if(etat == 0){printf(" Non Premier \n"); break; }else{ printf("Premier \n"); break;}). Avec cette méthode, ton truc te dira que 35 est premier.
    Il faut tester tous les diviseurs. Et si aucun n'a fonctionné alors il est premier. Tu peux raccourcir l'algo en testant 2 d'un côté puis ensuite ne prendre que les diviseurs impairs. Tu peux aussi arrêter quand le résultat de la division devient plus petit que le diviseur (c'est logique: si a divise n et donne b plus petit que a, alors b divise aussi n et aura fatalement été testé avant).

    Et sinon pour que ton code soit affiché correctement.

    PS: faire un "goto" juste pour s'éviter une boucle c'est franchement moyen.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. algorithme des nombres premiers
    Par sali2801 dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 01/11/2010, 17h28
  2. [debutant] Algorithme nombres premiers!
    Par Javamar dans le forum Général Java
    Réponses: 22
    Dernier message: 02/02/2009, 14h08
  3. Cripter avec des nombres premiers
    Par clovis dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 14/04/2004, 19h10
  4. premier nombre premier superieur à m=10^100+1
    Par azman0101 dans le forum Mathématiques
    Réponses: 4
    Dernier message: 17/04/2003, 03h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo