NOMBRE PREMIER

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
- - Dernière réponse : cs_exar
Messages postés
286
Date d'inscription
vendredi 5 décembre 2003
Statut
Membre
Dernière intervention
22 avril 2012
- 28 août 2008 à 11:45
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/47784-nombre-premier

cs_exar
Messages postés
286
Date d'inscription
vendredi 5 décembre 2003
Statut
Membre
Dernière intervention
22 avril 2012
1 -
JFRANCOIS: tout-à-fait exact ! Beaucoup l'ignorent !
cs_jfrancois
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009
-
"0 et 1 sont premier... (bon pour zero c'est un cas particulier mais pour 1 il respect bien la régle des nombres premiers : un nombre est premier si et seulement si il est divisible par 1 et par lui même... 1 est divisible seulement par 1 et par lui même CQFD)"

NON ! 1 n'est pas premier. Il ne respecte pas la règle qui dit qu'un nombre naturel est premier si il admet exactement deux diviseurs DISTINCTS : 1 et lui-même. Or avec 1 les deux diviseurs sont identiques. Le premier nombre premier est 2.
coucou747
Messages postés
12336
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
29 -
mais euh... tu connais l'instruction break ?

ce code contient plus de printf que de lignes interessantes...
lynxtyle
Messages postés
79
Date d'inscription
samedi 25 septembre 2004
Statut
Membre
Dernière intervention
31 octobre 2011
2 -
sans oublier : c'est du C pas sur C++
sur ces 3 lignes de code ça change pas grand chose mais c'est important de le souligner quand même :P
lynxtyle
Messages postés
79
Date d'inscription
samedi 25 septembre 2004
Statut
Membre
Dernière intervention
31 octobre 2011
2 -
"ce logiciel vous permet de vérifier si un nombre est entier ou pas /
C'est simple et très facile ..."

nombre premier, nombre entier... on voit que tu maitrise le sujet pour toi les deux c'est du kifkif

donc oui à supprimer car en plus d'être bourrin et mal présenté, ton raisonnement mathématique est complétement faux... comme ton anglais d'ailleur ("DEVELLOPPED BY C++", "logiciel realise par WOODPECKER3", "Tante_KANZA_by_SIMO" et "WOODPECKER3 COMPANY"... faudrait savoir comment tu t'appel et... oh mon dieu je ferai jamais appel à ta multinational même si elle a le copyright des nombres premiers ou entier^^)

ensuite niveau grosses erreurs :
"int n" et "if ((n != 1)&&(n!= 0))"... sans rentrer dans le point de vu mathématique de la recherche de nombre premier ici il y a une grosse faille... et oui si on rentre -1 pour n??? et encore pire pour la suite... car si on rentre un nombre négatif encore plus petit ton "for (i = 2; i < n; i++, compteur++)" ne marche plus... bon suffit de le remplacer par un unsigned int et ça régle déjà ce premier souci...

ensuite pour n égal 0 ou 1 pourquoi tu écris 2 fois le même code? tu aurai plus vite fait de le marquer qu'une fois et faire la vérif par "if (n <= 1 )" (bien sur seulement si tu as remplacé ton "int n" par "unsigned int n")
et grand mathématicien que tu es : 0 et 1 sont premier... (bon pour zero c'est un cas particulier mais pour 1 il respect bien la régle des nombres premiers : un nombre est premier si et seulement si il est divisible par 1 et par lui même... 1 est divisible seulement par 1 et par lui même CQFD)
ceci est aussi valable pour 2... hors ton programme le considère aussi comme non premier :(

bon pour petifa "dés que test passe a 1 (pourquoi pas true)" simplement que notre programmeur est fénéant et qu'il a défini test comme un int et pas comme un bool sinon 1 et true serait revenu au même (donc 1 c'est plus rapide même si c'est moins lisible... mais vu le nombre de commentaire de la source, la lisibilité ne devait pas être sa priorité... surtout sur une source avec copyright^^)
et pour "A quoi sert compteur???" la réponse est simple : à rien du tout ! (même pour le débogage il y a aucune utilité)
par contre même si sa boucle fait tout les nombres paires elle n'est pas pour autant fausse... et n'est juste pas optimisé... oui, pour optimiser on pourrait diviser par 2 puis après seulement par les nombres impaires jusqu'à n/2 (et oui après n/2 de toute façon le résultat appartiendra toujours à ]1;2[ )... et on économise ainsi 3/4 des calculs (merci petifa)
et oui aussi pour "dés que test passe a 1 [...] la boucle devrait s'arrêter en même temps"

donc voilà un le même en plus potable et corrigé :

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

int main()
{
unsigned int i, n;
_Bool Premier;
Premier = true;

printf("saisissez un nombre\n\n");
scanf ("%d", &n);


if ( n <= 2 )
printf("\n%d est premier",n);

else
{
if (n % 2 == 0)
Premier = false;

else
{
for (i 3; i < (n/2); i i+2)
if (n % i == 0)
{
Premier = false;
break;
}
}
if ( Premier == false )
printf("\n%d n'est pas premier",n);
else
printf("\n%d est premier",n);

}

system("PAUSE"); //beurk c'est par portable
return 0;
}

voilà désolé mais j'ai pas mis de copyright...
PS : je l'ai pas testé (j'ai pas d'ordi) mais il doit mathématiquement être correct... si des erreurs hésitez pas à les corriger ;)