Inscription / Connexion Nouveau Sujet
Niveau terminale
Partager :

Algorithme nombres parfaits

Posté par
Matheudebute
08-09-15 à 22:10

Bonjour à tous, je vous écris en ce début de rentrée en terminale S pour ma part afin de vous demander de l'aide pour un DM où je peine à répondre. En effet, mon niveau en algorithmique est vraiment moyen et je n'arrive pas à trouver la démarche afin de répondre à une question donnée. Ici, mon professeur de spé maths me demande un DM :
-1 entier >= 0 est dit parfait s'il est la somme de ses diviseurs propres (>= 0 et < lui)
Implémentez un test de perfection et indiquer les parfaits <= 40.

Autant vous dire que je me sens perdu.. Bien entendu, je ne souhaite pas avoir le travail tout mâché mais bien des pistes sur la construction de l'algorithme (lignes, boucle pour/si/compteur) pour ensuite complétez mon travail.
Merci d'avance de m'aider si cela est le cas.
Bien à vous.

Posté par
Flewer
re : Algorithme nombres parfaits 08-09-15 à 22:29

Bonsoir,

tu pourrais chercher les diviseurs du nombre en question, les ajouter ensemble, et faire un test pour voir si la somme et le nombre sont égaux.

Posté par
Matheudebute
re : Algorithme nombres parfaits 08-09-15 à 23:11

Mais sachant que je dois trouver tous les nombres parfaits inférieurs ou égaux à 40 je dois prendre n comme nombre de départ et après je fais en fonction? Il n'y a pas de nombre spécifique à étudier

Posté par
mathafou Moderateur
re : Algorithme nombres parfaits 09-09-15 à 00:33

Bonsoir,

la règle d'or est de commencer par des trucs simples et ensuite de les étoffer pour faire ce qu'on demande au final

donc 1ere étape :
écrire un algorithme qui si on lui donne un nombre n en entrée calcule la somme de ses diviseurs et dit s'il est parfait ou pas


ensuite, une fois ça au point, mettre cet algorithme à l'intérieur d'un algorithme plus gros qui fera ce qui est demandé :

pour n de 1 à 40
tester si n est parfait ça c'est le premier algorithme que l'on recopie ici
finpour

Posté par
Cherchell
re : Algorithme nombres parfaits 09-09-15 à 08:43

Essaie cet algorithme, je l'ai fait rapidement et il peut y avoir une erreur, mais cela tourne autour de cela

Variables
n est un nombre entier
d est un nombre entier
s est un nombre entier
p est un nombre entier

Traitement
n prend la valeur 2
s prend la valeur 0
d prend la valeur 1
Tant que n ≤ 40
     Tant que d < n faire
          si mod(n, d) = 0 alors
          s prend la valeur s + d
          d prend la valeur d + 1
              Si n = s et si n ≠ 1 alors
                 afficher n
                 afficher  « est un  nombre parfait »
              Fin si
     Fin Tant que
Fin Tant que

Posté par
mathafou Moderateur
re : Algorithme nombres parfaits 09-09-15 à 09:33

Bonjour Cherchell,

deux "tant que" deux "Si" et seulement 3 "Fin", il en manque un

et à mon avis le test sur "si n = s" est mal placé
et quelques autres petites erreurs d'initialisations mal placées aussi
manque la progression sur n qui reste ici bloqué à 2 éternellement

mais sinon "cela tourne autour de ça", tout à fait
(il faut bien laisser à Matheudebute un peu de boulot de mise au point et de correction )

c'était bien pour ça que je dissociais le test "le nombre n est il parfait" du balayage de toutes les valeurs de n de 1 à 40

on peut même dissocier d'avantage en résolvant successivement :

tester si un nombre est diviseur d'un autre
trouver tous les diviseurs d'un nombre
calculer la somme des diviseurs d'un nombre
tester si un nombre est parfait
et finalement seulement trouver tous les nombres parfaits entre 1 et 40

ces questions successives se "matérialisant" à chaque fois par un algorithme, mis au point et testé séparément
puis inclus dans l'algorithme suivant

c'est finalement bien plus efficace que de commencer par

n = 2
tant que n ...

directement, pour écrire un "gros" algorithme dans lequel finalement on glisse des erreurs partout parce qu'on n'a pas ce fil conducteur de "étape par étape"

Posté par
Matheudebute
re : Algorithme nombres parfaits 09-09-15 à 15:55

D'abord, merci de vos réponses même si je reste un peu perdu je commence à avoir des pistes. Pour trouver si un diviseur est le diviseur d'un autre j'ai trouvé ça :

Lire n
C prend la valeur 0
Pour k allant de 1 à n
Si E(n/k)=n/k
Alors afficher k
C prend la valeur C+1
Fin Si
Fin Pour
Afficher C


Je ne suis pas sûr mais je réfléchis et j'avouerai que je rame un peu vu le temps que je passe dessus je décourage un peu!

Posté par
mathafou Moderateur
re : Algorithme nombres parfaits 09-09-15 à 16:14

trouver si un nombre d est diviseur d'un nombre n :

lire n
lire d
si E(n/k) = n/k
alors afficher "d est un diviseur de n"
sinon afficher "d n'est pas un diviseur de n"

trouver tous les diviseurs de n et dire combien il y en a :

Citation :
Lire n
C prend la valeur 0 // C sera le nombre de diviseurs trouvés
Pour k allant de 1 à n // on essaye tous les nombres entiers de 1 à n
Si E(n/k)=n/k // ce nombre k est il un diviseur de n
Alors afficher k // si oui, l'afficher
C prend la valeur C+1 // et les compter
Fin Si
Fin Pour // on boucle pour chercher tous les diviseurs
Afficher C // afficher le nombre de diviseurs


il n'est pas trop difficile de modifier légèrement cet algorithme pour lui faire calculer la somme de ces diviseurs

et donc à la fin d'ajouter un test simple pour dire si ce nombre n saisi est parfait ou pas.
dans cette utilisation pour tester si un nombre est parfait ou pas, il est d'ailleurs inutile d'afficher explicitement les diviseurs et de les compter : seule leur somme nous intéresse.


puis finalement de mettre tout ça dans une boucle "pour n de 1 à 40" à la place de saisir une seule valeur de n

ce qui répondra à la question posée et c'est fini.

nota : pour savoir si d est un diviseur de n, on peut tester E(n/d) égal ou pas à n/d
mais on peut aussi (tous les langages de programmation le permettent) calculer le reste de la division et tester s'il est nul

reste qui s'écrit avec l'opération "modulo" n%d dans la plupart des langages "dérivés du C" (Algobox par exemple)
ou parfois mod(n,d) comme le suggérait Cherchell.

si n%d = 0

ou
si mod(n,d) = 0
(d s'appelle k dans ton algorithme)

Posté par
mathafou Moderateur
re : Algorithme nombres parfaits 09-09-15 à 16:15

* copier coller malencontreux :

trouver si un nombre d est diviseur d'un nombre n :

lire n
lire d
si E(n/d) = n/d
alors afficher "d est un diviseur de n"
sinon afficher "d n'est pas un diviseur de n"

Posté par
Matheudebute
re : Algorithme nombres parfaits 09-09-15 à 16:18

Pour trouver tous les diviseurs d'un nombre j'ai utilisé cet algo :

N est du type nombre
I est du type nombre
M est du type nombre
Saisir la valeur de N
Lire N
Tant que N<=0 faire
N différent de 0
Lire N
Fin tant que
Afficher les diviseurs de N sont : (oui je dois le faire sur algobox)
Pour I allant de 1 à N
M prend la valeur N%I
Si M=0 alors
Afficher I
Fin SI
Fin Pour
Fin algo

Posté par
Matheudebute
re : Algorithme nombres parfaits 09-09-15 à 16:19

Excuse moi je n'avais pas vu ta réponse, je vais bosser sur ce que tu m'as proposé

Posté par
mathafou Moderateur
re : Algorithme nombres parfaits 09-09-15 à 16:31

attention que sur Algobox une égalité dans un test s'écrit avec deux signes " = "

si (M == 0)

avec un seul signe = ça ne fait pas du tout ce que tu crois :
ça met la valeur 0 dans M comme un "M prend la valeur 0" puis ça teste si le résultat est non nul (ce qui ne se produit jamais puisque justement on vient de mettre 0 !)
il est fort possible que les versions récentes de Algobox aient même transformé ce truc en erreur signalée.

on peut simplifier :
M prend la valeur N%I
Si M==0 alors

en juste
si N%I == 0 alors

(la variable M est du gâchis)

quoi qu'il en soit les deux algorithmes que tu as "trouvé" pour obtenir la liste des diviseurs d'un nombre sont équivalents (c'est du détail d'écriture)

Posté par
Matheudebute
re : Algorithme nombres parfaits 09-09-15 à 16:40

Merci de tes réponses. Oui j'ai corrigé mes égalités par 2 (==) mais lorsque je test mon algorithme avec les deux étapes que j'ai emboitées, lorsque je lance le test cela me met directement " d n'est pas un diviseur de N" avant même que je rentre N et lorsque je rentre une valeur pour N (par exemple N=6 cela me met 452 comme résultat et je doute que 6 ait 452 diviseurs aha!) Je vais continuer de chercher où j'ai pu faire mon erreur

Posté par
mathafou Moderateur
re : Algorithme nombres parfaits 09-09-15 à 17:35

lequel ? celui de 16h18 ou celui de 15h55 ? un des miens ? lequel ?

de toute façon aucun n'est correct au point de vue syntaxe pure pour Algobox.

tu prends ton algorithme dans Algobox, en mode "Editeur", et tu le copies-colle ici (à la souris, pas en retapant)



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

Inscription gratuite

Fiches en rapport

parmi 1742 fiches de maths

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 !