Inscription / Connexion Nouveau Sujet
Niveau calculatrices
Partager :

informatique : nombres parfaits entre 2 et 500 sous maple

Posté par
comlich
01-05-08 à 19:09

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.

Posté par
carpediem
informatique : nombre parfaits de 2 à 500 01-05-08 à 19:27

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...

Posté par
infophile
re : informatique : nombres parfaits entre 2 et 500 sous maple 01-05-08 à 19:27

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.

Posté par
infophile
re : informatique : nombres parfaits entre 2 et 500 sous maple 01-05-08 à 19:36

Salut carpediem, nos réponses se complètent

Posté par
comlich
re : informatique : nombres parfaits entre 2 et 500 sous maple 01-05-08 à 19:37

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.

Posté par
infophile
re : informatique : nombres parfaits entre 2 et 500 sous maple 01-05-08 à 19:41

Oui on peut bien sûr imbriquer des boucles :

Citation :
For n from 2 to 500 do

     For k from 1 to n do

        ...

     od;
od;


Posté par
comlich
re : informatique : nombres parfaits entre 2 et 500 sous maple 01-05-08 à 19:50

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é.

Posté par
comlich
re : informatique : nombres parfaits entre 2 et 500 sous maple 01-05-08 à 19:55

j'oubliais, la première ligne du programme est > S:=0;
et dans le message d'erreur c'est ''too'' au lieu de ''tooc''

Posté par
infophile
re : informatique : nombres parfaits entre 2 et 500 sous maple 01-05-08 à 19:55

Euh pourquoi tu mets S:=0 à cet endroit ?

Posté par
comlich
re : informatique : nombres parfaits entre 2 et 500 sous maple 01-05-08 à 20:03

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.

Posté par
infophile
re : informatique : nombres parfaits entre 2 et 500 sous maple 01-05-08 à 20:46

Bon je préfère utiliser les procédures c'est plus clean, voilà ce que je te propose :

Citation :
estparfait := proc(n) local k, S, test;
S := 0;
for k to n-1 do
    if irem(n, k) = 0 then S := S+k fi;
od;
if S = n then test := true else test := false fi;
test;
end proc;

nombresparfait := proc (a, b) local i;
for i from a to b do
    if estparfait(i) = true then print(i) fi;
od;
end proc;


Et on trouve 6, 28 et 496.

Posté par
carpediem
informatique : nombre parfaits de 2 à 500 01-05-08 à 21:02

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 :


Rester sur la page

Désolé, votre version d'Internet Explorer est plus que périmée ! Merci de le mettre à jour ou de télécharger Firefox ou Google Chrome pour utiliser le site. Votre ordinateur vous remerciera !