Algorithme qui affiche les N premiers entiers impairs (et pas plus)
Citation:
Envoyé par
arknos
... edit : Plus ou moins l'ambiguïté de l'énoncé:
"Les N premiers entiers impairs" : renvoie à :
- les N premiers impairs des entiers.
- les impairs des N premiers entiers.
L'énoncé initial ne présente aucune ambiguïté: l'ensemble des N premiers entiers impairs ne saurait être confondu avec celui des entiers impairs présents parmi les N premiers entiers :mrgreen:.
La distorsion de l'énoncé que tu introduis ne relève pas de son imprécision, mais d'un faute de compréhension; un peu de réflexion permet de s'en apercevoir.
Citation:
Envoyé par
tbc92
Les N premiers entiers impairs, il n'y a pas d'ambiguité, on veut afficher N lignes ...
Compare avec l'algorithme suivant
Code:
1 2 3 4 5 6
|
M = 2*N+1
tantque M >= 1
afficher M
M=M-2
fin |
On a 1000 soustractions au lieu de 2000, et aucune division au lieu de 2000 divisions.
Ce n'est pas un détail, c'est la différence entre un algorithme bâclé et un bon algorithme.
Ton procédé est effectivement celui qui répond à l'exigence du moindre calcul.
À un petit détail près :mrgreen:: le nombre de termes n'est pas celui que l'on attend.
En prenant par exemple N = 7, l'énumération s'amorce pour Mini = 2*7 + 1 = 15 et se poursuit par décrémentation jusqu'à Mfin = 1; il s'affiche donc sur l'écran:
(15 , 13 , 11 , 9 , 7 , 5 , 3 , 1) ... ce qui fait huit (8) termes.
Cela ira peut-être mieux en prenant M = 2*N - 1 , la liste précédente commençant désormais à Mini = 2*7 - 1 = 13 .
À croire qu'un mauvais sort s'acharne sur cette discussion :aie: : la même erreur avait été signalée auparavant (#20 à 22).
Les entiers impairs admettent deux expressions équivalentes: I = 2*k + 1 et I = 2*k - 1
dont l'opportunité dépend du contexte.
Algorithme qui n'affiche plus du tout les N premiers entiers impairs
Citation:
Envoyé par
tbc92
... c'est une piste pour un algorithme qui fera beaucoup moins de calcul que la version actuelle.
C'est juste.
Citation:
Envoyé par
tbc92
... Pour N = 126 ... si on fait un algorithme qui affiche les mêmes nombres, mais dans cet ordre :
1, 126, 2, 63, 3, 42 , 6, 21, 7, 18 9,14
J'imagine que c'est aussi une bonne réponse ...
... mais ça fait un peu désordre :D.
Il suffit de programmer la liste croissante des diviseurs, en notant le quotient correspondant, et avec une condition d'arrêt appropriée.
Par exemple en prévoyant un tableau de (N) booléens initialisés à False, et à l'aide des instructions suivantes:
Code:
1 2 3 4 5 6 7 8 9 10 11
| d:= 0;
REPEAT
Inc(d);
q:= N DIV d; // quotient de la division euclidienne
r:= N MOD d; // reste de la division euclidienne
Test:= (q>=d); // quotient non inférieur au diviseur
IF (Test AND (r=0)) THEN BEGIN
ListeB[d]:= True; IF (q>d) THEN ListeB[q]:= True
END
UNTIL (q<d); |
Il suffit ensuite d'énumérer les rangs des termes de valeur True:
Code:
1 2
| FOR k:= 1 TO N DO
IF ListeB[k] THEN <Afficher k> |
Mais là :furieux: on a changé de sujet ...