d<n
faux
d←d+1
d←1
m←0
ddivise n
m←m+d
m=n
nest parfait parfait
nn’est pas
vrai
faux
vrai
faux
vrai
Figure 3.2 – Organigramme de la première solution
m, on peut énumérer tous les diviseurs potentiels dde ndifférents de n, qui appartiennent néces-
sairement à l’intervalle [1,n−1], tester pour chacun d’entre eux s’il divise effectivement n, et
additionner ceux qui satisfont cette propriété.
Un organigramme formalisant cette solution est donné à la figure 3.2. Sa traduction en lan-
gage C est donnée à la figure 3.3.
Remarquons que dans ce programme, la borne supérieure des entiers à énumérer est représen-
tée par une constante n_max, plutôt que d’être directement encodée dans l’expression du gardien
de boucle. Il s’agit d’une bonne habitude de programmation, qui permet de facilement modi-
fier la valeur de cette borne supérieure, en garantissant que cette modification sera correctement
répercutée vers tous les endroits du programme qui en dépendent.
3.1.2 Deuxième solution
Il est clair que l’algorithme de la figure 3.2 n’est pas optimal. En effet, cet algorithme effectue
un certain nombre d’opérations qui sont inutiles. Par exemple, il n’est pas nécessaire de tester si 1
divise n, car cette propriété est toujours vraie. On pourrait donc gagner une étape en énumérant les
diviseurs potentiels dde nà partir de 2 plutôt que de 1. Cela nécessiterait d’initialiser la somme m
des diviseurs à 1 plutôt qu’à 0, ce qui revient à considérer que le diviseur 1 est systématiquement
présent. Cela n’est cependant pas le cas pour le nombre n=1, car on se limite aux diviseurs qui
sont strictement inférieurs à n. Ce problème peut être résolu en commençant l’énumération des
nombres nà considérer à partir de 2 plutôt que de 1, ce qui est correct car 1 n’est pas un nombre
59