Inscription / Connexion Nouveau Sujet
Niveau terminale
Partager :

Algorithme pour nombres parfaits inférieurs à 10 000

Posté par
Pierre95
03-01-14 à 14:00

Bonjour,
Je dois faire un algorithme qui me donne les nombres parfaits inférieurs à 10 000.
Je n'arrive pas à le faire en langage courant.. Et encore moins à le programmer sur algobox..
Si quelqu'un peut m'éclairer.. Ce serait super !
Merci d'avance

Posté par
fontaine6140
re : Algorithme pour nombres parfaits inférieurs à 10 000 03-01-14 à 14:39

Bonjour,

Qu'est-ce qu'un nombre parfait ?

Posté par
Pierre95
re : Algorithme pour nombres parfaits inférieurs à 10 000 03-01-14 à 14:41

Bonjour,
C'est un nombre qui n'admet comme diviseurs que lui-meme et 1

Posté par
fontaine6140
re : Algorithme pour nombres parfaits inférieurs à 10 000 03-01-14 à 14:43

Non!
Cela c'est plus ou moins la définition d'un nombre premier!

Posté par
Glapion Moderateur
re : Algorithme pour nombres parfaits inférieurs à 10 000 03-01-14 à 14:46

bonjour, un nombre parfait est un nombre n tel que la somme de ses diviseurs = 2n.

Donc déjà, construit la logique globale de l'algorithme :

on va faire une boucle faisant varier N de 1 à 10000
puis il faut trouver les diviseurs de N ou plutôt leur somme. On initialise une variable à S, puis
seconde boucle faisant varier K de 1 à N (on va tester tous les nombres entre 0 et N et s'ils sont un diviseur on les ajoute à S)
Pour tester s'il sont un diviseur de N on regarde si le reste de la division de N par K est nul ou pas. Dans algobox ça se note N%K donc on va mettre un
SI N%K == 0 ALORS
S Prend la valeur S+K
Fin SI
on termine la seconde boucle, on a donc maintenant dans S la somme des diviseurs et on peut tester si N est parfait
SI 2*N == S ALORS
Afficher N
FinSI
et on termine la première boucle

Essaye de coder ça dans Algobox, pour progresser dans les algorithmes il faut essayer de les faire soi même et se battre un peu avec la syntaxe.

Posté par
fontaine6140
re : Algorithme pour nombres parfaits inférieurs à 10 000 03-01-14 à 14:49

Bonjour Glapion,

La 2è boucle ne peut-elle pas être diminuée ,réduite de moitié ?

Posté par
Pierre95
re : Algorithme pour nombres parfaits inférieurs à 10 000 03-01-14 à 14:50

Ah oui en effet, je me suis trompée de définition..

J'essaie de rentrer ça dans algobox alors, merci beaucoup !

Posté par
Glapion Moderateur
re : Algorithme pour nombres parfaits inférieurs à 10 000 03-01-14 à 14:56

Oui on peut optimiser un peu tu as raison, et de rechercher des diviseurs que jusqu'à N/2 et en déduire les autres, mais je n'ai pas voulu compliquer pour un premier algorithme. Algobox est tellement performant que de 1 à 10000, il va faire ça très vite, même non optimisé.

Posté par
fontaine6140
re : Algorithme pour nombres parfaits inférieurs à 10 000 03-01-14 à 14:59

Posté par
fontaine6140
re : Algorithme pour nombres parfaits inférieurs à 10 000 03-01-14 à 15:02


On aurait pu optimiser en allant jusque la racine carrée du nombre à tester.
C'est ce que j'avais prévu.

Posté par
Glapion Moderateur
re : Algorithme pour nombres parfaits inférieurs à 10 000 03-01-14 à 15:07

oui N et pas N/2, tu as raison.

Posté par
Pierre95
re : Algorithme pour nombres parfaits inférieurs à 10 000 03-01-14 à 15:07

alors j'ai ça, mais ça me met "erreur ligne 15" apparemment j'ai dépassé la capacité d'algobox


VARIABLES
  S EST_DU_TYPE NOMBRE
  N EST_DU_TYPE NOMBRE
  i EST_DU_TYPE NOMBRE
DEBUT_ALGORITHME
  POUR N ALLANT_DE 1 A 10000
    DEBUT_POUR
    S PREND_LA_VALEUR 0
    POUR i ALLANT_DE 1 A N-1
      DEBUT_POUR
      SI (N%i==0) ALORS
        DEBUT_SI
        S PREND_LA_VALEUR S+i
        FIN_SI
      FIN_POUR
    SI (2*N==S) ALORS
      DEBUT_SI
      AFFICHER N
      FIN_SI
    FIN_POUR
FIN_ALGORITHME

Posté par
Glapion Moderateur
re : Algorithme pour nombres parfaits inférieurs à 10 000 03-01-14 à 15:20

Oui on dépasse une limite d'algobox sur les boucles imbriquées.
On va être obligé d'utiliser l'astuce que nous a donnée fontaine6140.

Mais d'abord, il faut que tu comprennes de quoi il s'agit. on ne va chercher les diviseurs que de 1 à N
car si on tombe sur un diviseur, on peut automatiquement en trouver un autre qui sera N/i

ça va donner :


VARIABLES
	S EST_DU_TYPE NOMBRE
	N EST_DU_TYPE NOMBRE
	i EST_DU_TYPE NOMBRE
DEBUT_ALGORITHME
	POUR N ALLANT_DE 2 A 10000
		DEBUT_POUR
		S PREND_LA_VALEUR 0
		POUR i ALLANT_DE 1 A sqrt(N)
			DEBUT_POUR
			SI (N%i==0) ALORS
				DEBUT_SI
				S PREND_LA_VALEUR S+i+N/i
				FIN_SI
			FIN_POUR
		SI (2*N==S) ALORS
			DEBUT_SI
			AFFICHER* N
			FIN_SI
		FIN_POUR
FIN_ALGORITHME

Posté par
Pierre95
re : Algorithme pour nombres parfaits inférieurs à 10 000 03-01-14 à 15:24

D'accord, mais pourquoi on va de 2 à 10 000 ?

Posté par
Pierre95
re : Algorithme pour nombres parfaits inférieurs à 10 000 03-01-14 à 15:28

je l'ai programmé sur algobox et ça marche, merci beaucoup !!

Posté par
Glapion Moderateur
re : Algorithme pour nombres parfaits inférieurs à 10 000 03-01-14 à 15:40

Oui fait partir N de 1 si tu veux (j'avais mis 2 car au début i allait de 1 jusqu'à N-1 et si N=1 ça faisait i allant de 1 à 0 et j'avais peur que ça crée une erreur), mais maintenant ça passe. De toute façon on sait que 1 n'est pas parfait.

Posté par
Pierre95
re : Algorithme pour nombres parfaits inférieurs à 10 000 03-01-14 à 16:11

ah d'accord, donc ça ne change rien, merci beaucoup pour ton aide !

Posté par
Pierre95
re : Algorithme pour nombres parfaits inférieurs à 10 000 03-01-14 à 16:34

Quand je le mets en langage courant, je met quoi dans l'initialisation ?

S prend la valeur 0
Entrer N  

?? Merci

Posté par
Glapion Moderateur
re : Algorithme pour nombres parfaits inférieurs à 10 000 03-01-14 à 16:48

ha non on entre pas N. (tu as vu l'instruction LIRE N quelque part ?)
tu ne sais même pas lire un programme algobox et le décrire en langage courant ? c'est pourtant plus facile que de faire l'inverse

Posté par
Pierre95
re : Algorithme pour nombres parfaits inférieurs à 10 000 03-01-14 à 16:50

Bah non justement, je n'ai pas vu Lire N.
C'est bien pour cela que je demande ce qu'il doit y avoir dans l'initialisation.
Je ne vais pas rien mettre si ?

Posté par
Glapion Moderateur
re : Algorithme pour nombres parfaits inférieurs à 10 000 03-01-14 à 16:53

ben non, on a besoin d'initialiser aucune variable.

Posté par
Pierre95
re : Algorithme pour nombres parfaits inférieurs à 10 000 03-01-14 à 16:59

Ah d'accord, même pas S à 0 ?

Posté par
Pierre95
re : Algorithme pour nombres parfaits inférieurs à 10 000 03-01-14 à 17:02

i est bien entier par contre ?

Posté par
Pierre95
re : Algorithme pour nombres parfaits inférieurs à 10 000 03-01-14 à 17:03

J'ai rien dit pour S, on lui affecte sa valeur après ! Désolé

Posté par
Pierre95
re : Algorithme pour nombres parfaits inférieurs à 10 000 03-01-14 à 17:09

Et il n'y a pas de sortie non plus ? Car N sort dans le traitement.

Posté par
Glapion Moderateur
re : Algorithme pour nombres parfaits inférieurs à 10 000 03-01-14 à 18:29

Les sorties ce sont les AFFICHER* N qui sont dans le traitement, oui

Posté par
Pierre95
re : Algorithme pour nombres parfaits inférieurs à 10 000 03-01-14 à 18:35

Pourquoi une étoile d'ailleurs ?

Ouais mais quand on l'écrit en langage courant il n'y a pas de rubrique "sortie" donc.

Posté par
Glapion Moderateur
re : Algorithme pour nombres parfaits inférieurs à 10 000 03-01-14 à 18:43

AFFICHER N met les nombres les uns à la suite des autres
AFFICHER* N permet d'aller à la ligne après chaque AFFICHER et donc de les avoir les uns en dessous des autres.
Si on ne met pas d'étoile, la sortie sera illisible (tu n'as qu'à essayer d'ailleurs).

Posté par
Pierre95
re : Algorithme pour nombres parfaits inférieurs à 10 000 03-01-14 à 18:48

Je me suis d'ailleurs demandé pourquoi ils étaient tous l'uns en dessous de l'autre, c'est donc grâce à l'étoile !
Merci beaucoup

Posté par
blackjack98
re : Algorithme pour nombres parfaits inférieurs à 10 000 17-11-17 à 23:56

[[b][b]b]Voici le programme du nombre parfais en langage C :[/b][/b][/b]


#include <stdio.h>
#include <conio.h>
#include <math.h>

main()
{
int n, i, ds, somme;
printf("n = ");
scanf("%d", &n);
somme=0;
for(ds=1;ds<n;ds++){if((n%ds) == 0){ somme = somme + ds ;}}

if(n == somme && n!=1){printf("%d est parfait\n", n);}
else{printf("%d est imparfait", n);}

getch();
}

Posté par
blackjack98
re : Algorithme pour nombres parfaits inférieurs à 10 000 17-11-17 à 23:59

[b][b][b]Voici le programme du nombre parfais en langage C à l'aide d'une fonction :[/b][/b][/b]

#include <stdio.h>
#include <conio.h>
#include <math.h>

int fct(int n)
{
int y, i, ds, somme;
somme=0;
for(ds=1;ds<n;ds++){if((n%ds) == 0){ somme = somme + ds ;}}
if(n == somme && n!=1){y=1;}
else{y=0;}
return(y);
}
main()

{ int nbr, y1;
    printf("nbr =");
    scanf("%d", &nbr);
    y1 = fct(nbr);
    printf("y1 = %d", y1);
    getch();
    
}


Executeeez !!!!

Posté par
blackjack98
re : Algorithme pour nombres parfaits inférieurs à 10 000 18-11-17 à 00:04

[b][b]Voici le programme de la détection des  nombres parfais de 1 à un nombre entier "p"  en langage C :[/b][/b]



#include <stdio.h>
#include <conio.h>
#include <math.h>

main()
{
int n, ds, somme, p;
printf("p = ");
scanf("%d", &p);

for(n=1;n<=p;n++){somme=0; for(ds=1;ds<n;ds++){if((n%ds) == 0){ somme = somme + ds ;}}

if(n == somme && n!=1){printf("%d est parfait\n", n);}}


getch();
}



Exécuteeeez !!!  

Posté par
Glapion Moderateur
re : Algorithme pour nombres parfaits inférieurs à 10 000 18-11-17 à 13:07

3 ans après, ça va faire une belle jambe au posteur qui en plus s'est désinscris du site entre temps et qui de toutes façons voulait un programme algobox.

Posté par
mathafou Moderateur
re : Algorithme pour nombres parfaits inférieurs à 10 000 18-11-17 à 13:29

Bonjour,

écriture en C "de cochon"
il ne s'agit pas de faire des concours du plus petit nombre de lignes du programme (tu pouvais même réduire encore ...)
mais de faire des programmes qui soient lisibles


et puis "au gout du jour" c'est en Python maintenant ...

Posté par
carpediem
re : Algorithme pour nombres parfaits inférieurs à 10 000 18-11-17 à 14:26

salut

lire n
s = 0
pour p = 1 à sqrt (n)
     q = n/p
     si q = ent (q) alors
          s = s + p + q
si s = 2n alors écrire n + "est parfait"


un autre

lire n
s = 0
p = 1
q = n
tant que q = ent (q) et p < q
     s = s + p + q
     p = p + 1
     q = n/p
si p = q alors s = s + p
si s = 2n alors écrire n + "est parfait"

Posté par
mathafou Moderateur
re : Algorithme pour nombres parfaits inférieurs à 10 000 18-11-17 à 14:43

attention à l'énoncé
on ne demande pas de dire si p est parfait, mais de donner la liste des nombres parfaits :
deux boucles imbriquées

Posté par
Wulfhartus
re : Algorithme pour nombres parfaits inférieurs à 10 000 01-01-18 à 04:03

Bon, il serait bon de ramener la vérité ici.
Déjà, un nombre parfait, c'est un nombre égal à la somme de ses diviseurs, aucun rapport avec des histoires de 2n, etc
Ainsi, 6 est parfait car 1+2+3 = 6
Ou encore 1+2+4+7+14=28, donc 28 est parfait

Ça marche aussi avec 496, etc.

ENSUITE

Un nombre N, contrairement à ce que vous dites, possède très souvent des diviseurs supérieurs à N.
Exemple avec 28 :
racine de 28 = à peu près 5,5.
Or 14 est un diviseur de 28, et 14>5,5
Donc un nombre peut avoir des diviseurs supérieurs à sa racine.
Donc votre algorithme est faux.

Si vous voulez optimiser votre programme, vous pouvez garder à l'esprit qu'aucun nombre N n'a de diviseur supérieur à N/2+1


Voici un programme en python qui mettra tout le monde d'accord :

def parfait(nombre) :
   sommeDiviseurs = 0
   for i in range(1, int(nombre/2+1)) :
      if nombre%i == 0 :
         sommeDiviseurs += i
   if sommeDiviseurs == nombre :
      return True
   else :
      return False

print("This is console module")
n = int(input("Combien de nombres ?"))
debut = int(input("À partir de combien ?"))
nombresRecontres = 0

while nombresRecontres < n:
   if parfait(debut) :
      print(debut)
      nombresRecontres += 1
   debut += 1
      
  
Si vous n'êtes toujours pas convaincus, voici un exemple de son exécution :

This is console module
Combien de nombres ?4
À partir de combien ?1
6
28
496
8128

#[QPython] Press enter to exit

Allez salut !

Posté par
Wulfhartus
re : Algorithme pour nombres parfaits inférieurs à 10 000 01-01-18 à 04:11

Pierre95 @ 03-01-2014 à 15:28

je l'ai programmé sur algobox et ça marche, merci beaucoup !!

Ça marche? Mais qu'affiche Algobox ?

Posté par
mathafou Moderateur
re : Algorithme pour nombres parfaits inférieurs à 10 000 01-01-18 à 11:12

Bonjour et bonne année,

quelques rectifications,

un nombre est parfait ssi il est égal à la somme de ses diviseurs propres

par exemple 28 admet 28 comme diviseur, si si!
de sorte que la somme des diviseurs tout court de 28 est 1 + 2 + 4 + 7 + 14 + 28 = 56
les diviseurs propres sont avec 28 exclus 1 + 2 + 4 + 7 + 14 = 28

Citation :
Donc un nombre peut avoir des diviseurs supérieurs à sa racine.
Donc votre algorithme est faux.

parce que tu ne l'as pas compris
si m est un diviseur de N < N, alors N/m est aussi un diviseur de N
de sorte que la recherche des diviseurs peut s'arrêter à N
et à chaque fois on trouve deux diviseurs d'un coup.
sauf si m est égal à N, car alors "l'autre" diviseur est le même.

Citation :
Si vous n'êtes toujours pas convaincus, voici un exemple de son exécution :

la preuve qu'un algorithme est correct ne peut pas être un exemple d'exécution !!
un exemple d'exécution ne peut éventuellement que apporter la preuve qu'un algorithme n'est pas correct
(s'il plante ou donne un résultat faux)

si "ça marche" on a juste augmenté la confiance subjective qu'il est peut être bon.

le tien est correct pour trouver les nombres parfaits mais pas optimisé du tout car tu fais trop d'essais (N/2 > N)

l'algorithme de carpediem est tout aussi correct exclusivement parce qu'on sait qu'un carré ne peut pas être un nombre parfait
donc inutile de tester si n est un nombre entier, à chaque test il trouve deux diviseurs distincts.
et comme il trouve tous les diviseurs y compris n lui même, le critère est que la somme de tous les diviseurs, y compris n, soit le double de n.



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 1719 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 !