Problème à comprendre code source C
Résolu/Fermé
A voir également:
- Problème à comprendre code source C
- Code ascii de a - Guide
- Code puk bloqué - Guide
- Comment déverrouiller un téléphone quand on a oublié le code - Guide
- Code activation windows 10 - Guide
- Code gta 4 ps4 - Guide
3 réponses
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
16 avril 2014 à 10:05
16 avril 2014 à 10:05
Bonjour,
Je ridirige ton post dans la catégorie "C".
while ( factor * factor < guess && guess % factor != 0 )
factor += 2;
Tant que factor n'est pas un multiple de guess, on continue de teste le suivant jusqu'à ce que factor < racine(guess) (ou factor*factor <guess). Pas besoin d'aller au delà. La boucle s'arrête donc pour deux raisons :
soit on a testé tous les diviseurs (factor)
soit le nombre n'est pas premier (il y a un factor qui divise guess).
if ( guess % factor != 0 )
printf ("%d\n", guess);
Si factor ne divise pas guess, c'est qu'on est sorti de la précédente boucle while pour l'autre raison. Autrement dit, le nombre guess est premier. Il faut donc l'afficher.
while ( guess <= limit ) {
Et on fait l'algorithme précédent pour tous les nombres jusqu'au nombre saisi par l'utilisateur (limit).
Sinon, l'algorithmique du code n'est pas parfaite. En effet, si l'utilisateur tape 2, le programme affichera 2 et 3 ;-). Il faudrait faire une condition d'affichage pour le 2 et le 3.
Cdlt,
Je ridirige ton post dans la catégorie "C".
while ( factor * factor < guess && guess % factor != 0 )
factor += 2;
Tant que factor n'est pas un multiple de guess, on continue de teste le suivant jusqu'à ce que factor < racine(guess) (ou factor*factor <guess). Pas besoin d'aller au delà. La boucle s'arrête donc pour deux raisons :
soit on a testé tous les diviseurs (factor)
soit le nombre n'est pas premier (il y a un factor qui divise guess).
if ( guess % factor != 0 )
printf ("%d\n", guess);
Si factor ne divise pas guess, c'est qu'on est sorti de la précédente boucle while pour l'autre raison. Autrement dit, le nombre guess est premier. Il faut donc l'afficher.
while ( guess <= limit ) {
Et on fait l'algorithme précédent pour tous les nombres jusqu'au nombre saisi par l'utilisateur (limit).
Sinon, l'algorithmique du code n'est pas parfaite. En effet, si l'utilisateur tape 2, le programme affichera 2 et 3 ;-). Il faudrait faire une condition d'affichage pour le 2 et le 3.
Cdlt,
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
19 avril 2014 à 22:48
19 avril 2014 à 22:48
Si j'ai bien compris factor * factor < guess est équivalent à factor < sqrt(guess) ?
Exactement. Si a et b sont positif et si a < b alors sqrt(a) < sqrt(b).
Je suppose que l'auteur a utilisé cette méthode pour éviter de faire appel à la fonction sqrt() et ainsi optimiser son code ?
Tout à fait.
je ne savais pas non plus qu'on pouvait valider qu'il s'agit, ou non, d'un premier en ne vérifiant que la racine du nombre.
Objection ! On ne vérifie pas que la racine du nombre. On vérifie qu'il n'y a aucun diviseur inférieur à la racine du nombre.
Et oui, les mathématiques sont importantes en programmation ;-)
Exactement. Si a et b sont positif et si a < b alors sqrt(a) < sqrt(b).
Je suppose que l'auteur a utilisé cette méthode pour éviter de faire appel à la fonction sqrt() et ainsi optimiser son code ?
Tout à fait.
je ne savais pas non plus qu'on pouvait valider qu'il s'agit, ou non, d'un premier en ne vérifiant que la racine du nombre.
Objection ! On ne vérifie pas que la racine du nombre. On vérifie qu'il n'y a aucun diviseur inférieur à la racine du nombre.
Et oui, les mathématiques sont importantes en programmation ;-)
Twinuts
Messages postés
5375
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
14 juin 2023
2
16 avril 2014 à 11:08
16 avril 2014 à 11:08
Salut,
J'ai modifié ton poste pour ajouter les balies "code".
J'ai modifié ton poste pour ajouter les balies "code".
17 avril 2014 à 20:10
17 avril 2014 à 22:12
J'essaie :
Pour déterminer si N est premier, on va tester successivement pour p.
Etape 1 : On teste déjà pour p entre 2 et racine(N). Dans ce cas, q sera entre racine(N) et N. Si N est premier, on ne trouvera pas p et q (p et q entiers) tel que N=p*q (p différent de 1 et de N).
Etape 2: On teste avec q>racine(N), on aura dans ce cas q entre 2 et racine(N). Le cas entre 2 et racine(N) a été testé en étape 1 (N=p*q=q*p => symétrie).
Donc l'étape 2 est inutile...
Donc, il suffit juste de tester les diviseurs entre 0 et racine(N).
Autrement dit, il suffit de tester factor<=racine(N) => factor*factor<=N
19 avril 2014 à 22:43
Si j'ai bien compris factor * factor < guess est équivalent à factor < sqrt(guess) ?
Je suppose que l'auteur a utilisé cette méthode pour éviter de faire appel à la fonction sqrt() et ainsi optimiser son code ?
Si c'est ça, c'est plutôt des lacunes en math qui me bloquent car je ne savais pas qu'on pouvait faire comme ça et je ne savais pas non plus qu'on pouvait valider qu'il s'agit, ou non, d'un premier en ne vérifiant que la racine du nombre.
Merci fiddy.