|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | |||||
![]() Étudiant Inscription : novembre 2012 Messages : 8 ![]() |
Bonsoir développeurs.
Je profite de mon premier post sur ce forum pour présenter mon profil de développeur. Naindev, 19 ans, étudiant en L1 de Mathématiques-Informatique, Paris. Concernant ma question, voici l'énoncé de mon exercice : Citation:
Code :
En exécutant ce code, je me retrouve avec tous les nombres premiers compris entre 0 et 100 + 101. 97 est le dernier nombre premier compris entre 1 et 100, ensuite viennent 98, 99, 100 qui engendreront l'exécution de la partie en gras. Puis 101 qui est premier, qui fera donc afficher 101 et sortir de la boucle "while" ( 101 étant supérieur à 100 ). Cependant, l'énoncé de l'exercice ne réclame que les nombres premiers compris entre 0 et 100, donc pas le 101. J'ai donc modifié mon code de la sorte : Code :
J'aimerais donc, si possible, avoir une solution à ce petit souci, et, par la même occasion, avoir votre avis sur cette solution ( je vous prie d'en proposer une meilleure si vous en avez ). Merci, et bon développement. |
|||||
|
|
00
|
|
|
#2 | ||
![]() ![]() ![]() Inscription : avril 2002 Messages : 2 278 ![]() |
Ton code est un peu "alambiqué", on comprend pas tout du premier coup d'oeil. Pourtant si tu exprimes la liste des actions à effectuer en français, le problème parait plus simple...
Code :
__________________
M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal |
||
|
|
00
|
|
|
#3 | ||
![]() Étudiant Inscription : novembre 2012 Messages : 8 ![]() |
Quel que soit L, 1 et 2 sont des nombres premiers. je commence donc par les afficher. Ensuite, j'affecte à n ( qui est un des nombres entiers compris entre 0 et L ) la valeur 3. Tant que n est inférieur à L ( 100 dans mon test ), je réinitialise la variable j ( potentiel diviseur de n ) à 2.
Après, je répète n mod j. Si n mod j est différent de 0, j n'est donc pas un diviseur de n, on passe au j suivant ( j:= j+1 ). Quand n=j, n est donc premier ( aucun des nombres compris en 1 et n ne divise n ), on sort de la boucle répéter mais on reste dans tant que ( car n inférieur à 100 ) et on affiche n. Si n mod j est 0, on passe directement au n suivant et on réinitialise j à 2. n sera sûrement supérieur à j car sa valeur initiale est 3, donc on reste dans la boucle répéter. Voici l'explication littéraire de mon programme. Concernant mon souci, j'ai trouvé la solution ( très évidente, au fait ). Voici le nouveau code ( la ligne rajoutée est la 34 ) : Code :
Merci. |
||
|
|
00
|
|
|
#4 |
|
Expert Confirmé
![]() ![]() Inscription : août 2006 Messages : 3 433 ![]() |
Hia,
Erreur, 1 n'est pas un nombre premier. Car, contrairement à la définition populaire "un nombre premier n'est divisible que par 1 et lui-même", qui est fausse, la définition réelle est un nombre premier a 2 diviseurs, et 2 seulement. (Pour les matheux : on ne parle ici que des premiers dans les entiers naturels, ne venez pas perturber avec des définitions que le commun des mortels ne comprendra pas. Ainsi : 1 a un seul diviseur (1) ==> pas premier 2 a 2 diviseurs (1, 2) ==> premier 3 a 2 diviseurs (1, 3) ==> premier 4 a 3 diviseurs (1, 2, 4) ==> pas premier ...
__________________
Il court en ce moment une espèce de grippe, mais elle ne court pas très vite, car on peut l'attraper sans courir. |
|
|
00
|
|
|
#5 |
![]() Étudiant Inscription : novembre 2012 Messages : 8 ![]() |
En effet, il n'est question que des nombres premiers dans les entiers naturels. De quelle(s) autre(s) définition(s) veux-tu parler ?
Sinon, il est vrai que 1 n'est pas premier. Je l'enlève. En attente d'autres avis... |
|
|
00
|
|
|
#6 | ||
|
Membre Expert
![]() ![]() Roland ChastainInscription : décembre 2011 Messages : 732 ![]() |
Moi aussi je trouve ton code un peu difficile à comprendre (étant donnée la simplicité de l'algorithme).
Pour parcourir la série des nombres à étudier, il serait plus naturel d'utiliser for que while. Une autre suggestion que je ferais, c'est de séparer les deux parties du programmes : la fonction qui établit si un nombre est premier ou pas, et la procédure qui fait appel à cette fonction pour telle série de nombres. Code :
__________________
L'Art est long et le Temps est court. |
||
|
|
00
|
|
|
#7 |
![]() Étudiant Inscription : novembre 2012 Messages : 8 ![]() |
J'ai utilisé dans mon premier test la boucle for. Cependant, en exécutant, c'est une boucle infinie qui affiche tous les nombres premiers entre 0 et 32 767 ( ce nombre étant la limite maximale des nombres Integer ). J'ai relié cet effet à l'incrémentation qui doit être faite au sein de la boucle, n:=n+1 à la ligne 37 ( J'en profite pour poser ma question : est-ce que l'incrémentation de la variable de la boucle for a quelconque effet sur le fonctionnement de cette boucle ? ).
Concernant l'utilisation des fonctions, que ce soit en cours ou seul, je n'ai encore rien appris sur leur utilisation. Enfin, j'aimerais que vous m'expliquiez où/comment trouvez-vous mon code difficile à comprendre. |
|
|
00
|
|
|
#8 |
|
Membre Expert
![]() ![]() Roland ChastainInscription : décembre 2011 Messages : 732 ![]() |
Pour tout nombre entier compris entre 0 et 100, on fera telle chose.
Maintenant, si tu changes la valeur de n au beau milieu de la boucle, c'est sûr que ça ne va plus marcher, mais ça ne prouve pas qu'il faille remplacer for par while. Si j'ai bien compris, pour obtenir que ton code fonctionne, tu as dû ajouter cette ligne : C'est bien qu'il y a un problème de conception, non ?
__________________
L'Art est long et le Temps est court. |
|
|
00
|
|
|
#9 | ||
|
Membre Expert
![]() Inscription : septembre 2009 Messages : 980 ![]() |
Si ça t’intéresse, j'avais fait ce programme lors d'un petit concours pour trouver tout les diviseurs d'un nombre entre 1 et 2^32-1 (MAXINT)
![]() Le tout le plus rapidement possible (condition du concours le plus rapide pour trouver les diviseurs de 864864000 (1152)) ici cette routine le fait en 1650 cycles/t>0ms (on avait pas réussi à faire mieux sauf en pur assembleur) et indique, en prime, si le nombre testé était un nombre premier. donc voici le code : Code :
__________________
[ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ] Ma messagerie n'est pas la succursale du forum... merci! |
||
|
|
10
|
|
|
#10 | ||
![]() Étudiant Inscription : novembre 2012 Messages : 8 ![]() |
Citation:
Citation:
Concernant for ou while, tu le dis toi-même, l'incrémentation ( obligée ) de la variable qu'utilise le for engendre un dysfonctionnement de la boucle. Comment veux »tu que je l'utilise ? |
||
|
|
00
|
|
|
#11 | ||||||||
|
Membre Expert
![]() Inscription : septembre 2009 Messages : 980 ![]() |
Tiens une version amélioré du code que je t'ai mis plus haut :
Code :
A utiliser comme suit : Code :
J'ai tester avec ce programme : Code :
Code :
__________________
[ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ] Ma messagerie n'est pas la succursale du forum... merci! |
||||||||
|
|
10
|
Copyright © 2000-2013 - www.developpez.com