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 :

Problème fonction nombre premier


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 187
    Par défaut Problème fonction nombre premier
    Bonjour,
    j'ai écris une fonction qui teste si un nombre est un nombre premier ou pas.
    Elle fonctionne avec des petits nombres, mais quand je la teste avec des grands nombres, elle plante à l'exécution...

    Le nombre est un unsigned int, je la teste donc avec la plus grande valeur possible: 4294967295 et ca plante à l'exécution... Pareil si je fais 4294967291, etc

    La voici:
    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
    BOOLEAN premier ( unsigned int n)
    {      	BOOLEAN verif;
    	unsigned int i;
    	verif=VRAI;
     
    	if (n<2 || (n!=2 && n%2==0))
    	    verif = FAUX;
    	else
    	{
    	    i=n-1;
    	    while (i>1){
    	        if ((n%i)==0)
    	        	verif = FAUX;
    	        i=i-1;
    	    }
    	}
     
    	return verif;
    }
    PS: BOOLEAN est un type que j'ai créé avec VRAI et FAUX, pas de soucis à chercher à ce niveau la!

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par alex2746 Voir le message
    Bonjour,
    j'ai écris une fonction qui teste si un nombre est un nombre premier ou pas.
    Elle fonctionne avec des petits nombres, mais quand je la teste avec des grands nombres, elle plante à l'exécution...
    Tu as essayé avec un debugger parce que là, je ne voie aucune raison de faire crasher le programme.

    Par contre, ton algo est faux (mais ne fait pas crasher)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	    while (i>1){
    	        if ((n%i)==0)
    	        {
    	        	verif = FAUX;
    	        	break;
    	        }
    	        i=i-1;
    	    }
    Dès que tu as trouvé une condition de divisibilité, tu sais que ton nombre n'est pas premier, donc tu peux quitter la boucle.

    Pour info, une optimisation est encore possible en faisant intervenir la racine carrée (tu testes de 3 à racine carrée de ton nombre) alors que toi, tu testes de nombre - 1 à 1
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 187
    Par défaut
    Je ne comprends vraiment pas mon problème...

    J'ai essayé avec le débugueur, exécuter étape par étape, mais je ne peux pas appuyer 4000000000 de fois sur la touche, donc j'ai fais evoluer un peu mon i et puis j'ai changé la valeur du i en 50, et tout se passe bien...

    Mais quand je l'exécute tout d'une fois, ca plante...

  4. #4
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 084
    Par défaut
    A tout hasard, pourrai-t'on recuperer quelque part comment est gerer l'operateur modulo ? Cela vient peut etre de la s'il ne gere pas les unsigned

  5. #5
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Le code fonctionne chez moi sans planter (et trouve que 4294967291 est premier alors que 4294967295 ne l'est évidemment pas).

    Si on prend en compte la remarque de ram-0000 sur le break, c'est une mauvaise idée de faire décroître i puisque le nombre a beaucoup plus de chances d'être divisible par un petit nombre que par un grand. Par exemple, il n'a aucune chance d'être divisible par i pour i> n/2.

    SofEvans :
    A tout hasard, pourrai-t'on recuperer quelque part comment est gerer l'operateur modulo ? Cela vient peut etre de la s'il ne gere pas les unsigned
    Il gère tous les types entiers. On peut récupérer ces informations dans la norme :

    Citation Envoyé par n1256
    6.5.5 Multiplicative operators
    Syntax
    ...
    Constraints
    2 Each of the operands shall have arithmetic type. The operands of the % operator shall have integer type.
    Semantics
    3 The usual arithmetic conversions are performed on the operands.
    ...
    5 The result of the / operator is the quotient from the division of the first operand by the second; the result of the % operator is the remainder. In both operations, if the value of the second operand is zero, the behavior is undefined.
    6 When integers are divided, the result of the / operator is the algebraic quotient with any fractional part discarded.90) If the quotient a/b is representable, the expression (a/b)*b + a%b shall equal a.
    ...
    90) This is often called ‘‘truncation toward zero’’.

  6. #6
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 187
    Par défaut
    D'accord... Je ne comprends vraiment pas pourquoi chez moi il plante quand je mets 4294967295...
    Quand je lance l'exécutable sur dos, il ne m'affiche rien et le curseur clique, je ne sais rien faire a part quitter..

    J'utilise Eclipse comme IDE et je travaille avec un projet C ANSI.

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    Pour info, une optimisation est encore possible en faisant intervenir la racine carrée (tu testes de 3 à racine carrée de ton nombre) alors que toi, tu testes de nombre - 1 à 1
    Même sans faire intervenir la racine (ce qui peut prendre du temps). On peut quitter la boucle dès que le résultat de la division devient plus petit que le diviseur (sous entendus si on fait varier les indices à partir de 3 vers le nombre et non l'inverse)

    Une autre optimisation serait de faire varier les indices de 2 en 2 vu que les indices pairs sont définitivement éliminés...

    Sinon concernant le pb de plantage, moi je tenterais de forcer le type "long" au lieu de "int" pour les variables...
    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]

  8. #8
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 084
    Par défaut
    Bon, d'apres les remarque, il semblerai que le probleme ne vienne pas du code ...
    Peut etre cela vient-il du compilateur que tu utilise ? Est-ce vraiment un compilateur C et non C++ ?

  9. #9
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par SofEvans Voir le message
    Est-ce vraiment un compilateur C et non C++ ?
    Et quand bien même, cela ne devrait pas être un problème
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

Discussions similaires

  1. Une fonction implémentée en Java pour afficher les nombres premiers
    Par autran dans le forum Codes sources à télécharger
    Réponses: 2
    Dernier message: 01/05/2015, 16h45
  2. Réponses: 6
    Dernier message: 30/03/2015, 15h20
  3. Exercice fonction nombre premier
    Par kreuk801 dans le forum Débuter
    Réponses: 18
    Dernier message: 10/02/2011, 15h02
  4. 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
  5. 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