Bonjour à tous.
Je suis sur un exercice d'info où le but est de trouver les nombres parfaits qui sont entre 2 et 500.
Tout d'abord : on dit qu'un nombre est parfait s'il est la somme de ses diviseurs propres. On appelle diviseur propre d'un entier n tout diviseur de n compris entre n et n-1.
Pour k allant de 1 à n-1 la condition k divise n s'écrit sous maple irem(n,k)=0 (ie le reste de la division euclidienne de n par k est = 0).
La 1ière question était de vérifier que 28 est parfait, alors j'ai écrit:
> S:=0;
>for k from 1 to 27 do
> if irem(28,k)=0 then
> S:=S+k;
> fi;
> od;
>S;
et je trouve bien 28.
Ensuite on me demande d'écrire un programme affichant tous les nombres parfaits compris entre 2 et 500.
Avec un procédure préalablement défini et retournant la somme des diviseurs propres d'un entier, j'aurai pu y arriver, mais le problème ici c'est que l'exercice demande d'utiliser un programme.
J'aimerais s'il vous plaît de l'aide sur cette question.
Je vous remercie d'avance.
salut
généralise ton programme en remplaçant 28 par n et fait varier n de 2 à 500
si n = S alors n est parfait...
Salut
Tu peux écrire une procédure qui teste si un nombre est parfait ou non, et ensuite tu fais une boucle pour balayer les entiers de 2 à 500 avec un test condition.
Merci.
Pour ce qui est de la procédure c'est justement ça que j'évite, néamoins merci.
Pour l'autre possibilité, ce que j'aimerais savoir c'est comment faire varier n de 2 à 500, et dans le même programme faire varier k de 1 à n.
Serait-ce une boucle for imbriqué dans une autre? J'ai tenté un truc du genre mais ça ne m'a pas mené bien loin, c'est peut être moi qui ai mal imbriqué les boucles for. Par ailleurs j'ai lu quelque part qu'on pouvait les imbriquer mais pour des variables indépendantes et je me demande si ça peut vraiment marcher dans mon cas.
Oui on peut bien sûr imbriquer des boucles :
J'ai essayé:
> for n from 2 to 500 do
> for k from 1 to n-1 do
> if irem(n,k)=0 then
> S:=S+k;
> fi;
> if S=n then
> print(n);
> fi;
> S:=0;
> od;
> od;
mais je reçois le mesaage : Error, tooc many levels of recursion
je me demande alors si ce sont les if que j'ai mal utilisé.
j'oubliais, la première ligne du programme est > S:=0;
et dans le message d'erreur c'est ''too'' au lieu de ''tooc''
Au début c'est pour initialiser cette variable(dans le cas où quelque chose y serait déjà rangé, c'est une précaution que mon prof me conseillait de tjrs prendre), à la fin je le mets pour reinitialiser S, vu que les opérations seront reprises avec le même S mais pour la valeur suivante de n.
Bon je préfère utiliser les procédures c'est plus clean, voilà ce que je te propose :
salut infophile
tout à fait et quelle simultanéité
sinon les 2 boucles peuvent être imbriquées (sans avoir besoin de S:=0 à la fin mais au début)
quant au message d'erreur ç'est un pb de mémoire car tu fait ton test (S=n)à l'intérieur de la boucle k
il faut d'abord la finir avant de comparer S et n et conclure
Vous devez être membre accéder à ce service...
Pas encore inscrit ?
1 compte par personne, multi-compte interdit !
Ou identifiez-vous :