Programme pour nombre parfait [Fermé]

Signaler
Messages postés
21
Date d'inscription
dimanche 23 octobre 2005
Statut
Membre
Dernière intervention
17 mars 2009
-
 med -
Bonjour,
je voudrais vous demander une faveur :
j'ai pas su trouver un code pour cette exercice :
Ecrire un programme qui permet de determiner parmi les 100 premiers nombres entiers ceux qui sont parfaits.
Merci
A voir également:

12 réponses

Messages postés
16307
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
15 avril 2021
2 820
Comme tout le monde y va régulièrement de son petit code, je vais y mettre mon grain de sel parce qu'au final tout le monde fait plus ou moins pareil : une boucle de 1 à n/2 (voire de 1 à n) et on calcule à la fin la somme des diviseurs pour comparer avec n.

Pourtant il y a au moins deux méthodes pour faire mieux :

1) si au cours du calcul la somme des diviseurs dépasse déjà n, ce n'est pas la peine de continuer ! Du coup il est intéressant de calculer les plus grand diviseurs en premier.
Exemple avec n=12 dont les diviseurs sont 1, 2, 3, 4 et 6. En commençant par la fin on fait la somme 6+4+3=13, on est déjà supérieur à 12 donc ce n'est pas nécessaire de calculer les diviseurs 2 et 1 pour savoir que 12 n'est pas parfait !

2) si k est un diviseur de n, alors n/k en est également un autre (2 divise 12 donc 6 aussi) donc au lieu d'aller chercher des diviseurs jusqu'à n/2 on peut s'arrêter à sqrt(n).
On parcourt donc uniquement les diviseurs inférieurs à sqrt(n), ce qui fait des calculs avec de "petits" diviseurs, et lorsqu'on a trouvé un diviseur k, on ajoute k ET n/k, ce qui fait qu'on ajoute bien les plus grands diviseurs en premier (k petit --> n/k grand)
Exemple avec n=12, on part de la somme à 1 puisque c'est toujours un diviseur, on fait le calcul avec 2 qui est un diviseur on ajoute donc à la somme 2 ET 6(=12/2), et après on fait le test sur 3 et on rajoute 3 ET 4(=12/3) et on s'arrête d'une part parce que la somme est déjà supérieure à 12 et d'autre part parce que la racine de 12 est 3,46 et qu'on ne va pas au delà (sinon on compterait une deuxième fois le 4 !)
Attention : si k==sqrt(n)==n/k il ne faut bien sûr compter le diviseur qu'une seule fois !

À quoi ça sert d'autant s'embêter ? Par exemple pour savoir si 137438691328 est un nombre parfait, en s'arrêtant à n/2 vous allez faire 69 milliards de calculs n%k alors qu'en vous arrêtant à sqrt(n) vous n'allez en faire "que" 371 millions (ce qui se fait en 1 seconde)
Ces allègements des calculs se feront surtout ressentir si vous cherchez TOUS les nombres parfaits sur un intervalle donné. Par exemple pour chercher les nombres parfaits entre 1 et 100 000, en s'arrêtant à n/2 vous ferez 2.5 milliards de calculs contre 21 millions en s'arrêtant à sqrt(n)...
7
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

pouvez vous donner le programme écris en c,compiler,prsk j'arrive pas a compiler le programme que j'ai écris, je sais pas ou je fais l'erreur ^^^^
Messages postés
16307
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
15 avril 2021
2 820
J'ai déjà posté un code en C mais sur un autre post, regarde Langage C, Nombre parfait
Messages postés
1022
Date d'inscription
samedi 21 août 2010
Statut
Membre
Dernière intervention
2 août 2015
116
Bonjour,

Merci d'essayer de soigner votre orthographe, ou au moins utiliser les majuscules et la ponctuation.

Et pour les codes, vous pouvez les entourer de la balise < code > < /code >, votre code n'en sera que plus clair :)

Sinon pour l'algorithme, il faut trouver tous les diviseurs, avec une boucle divisant par des nombres premiers (nombre premier = nombre divisible par 1 et lui-même), fonction qui elle-même se base sur le nombre de diviseurs de celui-ci.

Bref, c'est quand-même un peu plus poussé dans les mathématiques, mais c'est faisable.

Dans quel language souhaites-tu écrire ce programme ?
Messages postés
1640
Date d'inscription
lundi 18 juin 2007
Statut
Membre
Dernière intervention
15 juillet 2009
422
bonjour,

on ne te dira que ce qu'est qu'un nombre parfaits, et non pas le code de ton exercice.

un nb parfait, es tun nb dont la somme de tous ces diviseurs est égale à lui même.

exemple :
6 = 1*2*3
1+2+3 = 6
Messages postés
16307
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
15 avril 2021
2 820
Attention !
En écrivant 6 = 1*2*3 tu laisses penser qu'il faut faire une décomposition en facteurs premiers.
Or il s'agit de faire la somme de tous les diviseurs, par exemple 28 est premier car ses diviseurs sont 1, 2, 4, 7 et 14 (la somme fait bien 28) mais en aucun cas 28 n'est égal au produit 1*2*4*7*14...
merci pour l'information
pouvez -vous m'aider svp, je n'arrive pas a écrire un programme en langage c qui permet d'afficher tous les nombres parfais trouvant dans l'intervalle [0,1000]. est ce qlq peux me sauver.
pour être honnête il n'existe que 2 nombres parfaits compris entre 0 et 100 ki sont 6 & 28 mais je ne crois pas k''il existe un programme pour calculer les nombres parfaits mais il existe un site ki peut t'aider à les retrouver: http://serge.mehl.free.fr/anx/nb_parf.html
Messages postés
1640
Date d'inscription
lundi 18 juin 2007
Statut
Membre
Dernière intervention
15 juillet 2009
422
ba le but, es tde le créer ce programme...

et surtout l'avantage c'es tqu'il peut trouver les nombre entre 1 et 1.000.000

Messages postés
30
Date d'inscription
vendredi 2 septembre 2011
Statut
Membre
Dernière intervention
9 juin 2012
4
je pense que ce programme peut t'aider:
http://www.tech4um.com/Développement_Logiciel-Java-Le_nombre_premier_et_nombre_parfait_en_java-75.html
bool parfait(BigInteger& n)
{
if (n % 2 != 0)
return 0;

BigInteger d, sum;
sum = 1;
for (d = 2; d * d <= n; d++)
if (n % d == 0)
{
sum += d;
sum += n / d;
}
return sum == n;
}

Voici mon programme en c++ déjà tester pour les nombres parfait :

#include <cstdlib>
#include <iostream>

using namespace std;

int test ( int nbr)
{
int somme=0,i;
for (i=1;i<=nbr/2;i++){

if (nbr%i==0) somme=somme+i;
}
cout << somme<<endl;

if (somme==nbr)
cout << "parfait" <<endl;
else cout << "imparfait"<<endl;}


int main(int argc, char *argv[])
{
int nbr;
cout <<"entrer le nombre a tester "<<endl;
cin >> nbr;
test(nbr);

system("PAUSE");
return EXIT_SUCCESS;
}
essay ce programme, code java


import biputil.*;
public class becham
{public static void maion (String[]args) throws Exception
{
System.out.println ("entrer le nombre maximal de la recherch");
int n=Keyboard.getInt();

for (int i=1;i<=n;i++)
{
int z=i*(i+1/2);
if (i=z)
{
System.out.println ("le nombre "+i+" est parfait");
}
}
}
}
té null !!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Messages postés
1640
Date d'inscription
lundi 18 juin 2007
Statut
Membre
Dernière intervention
15 juillet 2009
422
et toi tu propose koi ?
reee sfel jété hors home
bon att donne moi 5 min
import java.util.*;
import javax.swing.JOptionPane;
public class hamza
{
private static Scanner x = new Scanner(System.in);

public hamza()

{


String affichage = "Ce programme vous demande de saisir un nombre et il va determiner \n tous les nombres parfaits Inférieures a ce nombre .\n Auteur Hamza © \n pour Entrer cliquer sur OK SVP ";
int n,i,j,somme=0;
String rep="";

JOptionPane.showMessageDialog(null,affichage,":...>>>>>>>> HaMzA <<<<<<<<...:",JOptionPane.INFORMATION_MESSAGE);

do
{
System.out.println("Entrer SVP votre nombre ");
n = x.nextInt();

System.out.println("les nombres parfaits inferieurs A "+n+ " : ");

for( i = 1; i <= n; i++)


{

if(parfait(i))

{
System.out.println(i);
}

}

rep = JOptionPane.showInputDialog("Voulez vous continuez oui / non ??? ");

} while(rep.equals("oui"));




}

public static boolean parfait (int nbr)

{

int i ,somme=0;

for( i = 1; i <= nbr / 2; i++)

{

if(nbr % i == 0)
somme += i;




}

return (nbr == somme);

}


public static void main (String [] hamza)

{
new hamza ();

}

}

#include <cstdlib>
#include <iostream>

using namespace std;

int test ( int nbr)
{
int somme=0,i;
for (i=1;i<=nbr/2;i++){

if (nbr%i==0) somme=somme+i;
}
cout << somme<<endl;

if (somme==nbr)
cout << "parfait" <<endl;
else cout << "imparfait"<<endl;}


int main(int argc, char *argv[])
{
int nbr;
cout <<"entrer le nombre a tester "<<endl;
cin >> nbr;
test(nbr);

system("PAUSE");
return EXIT_SUCCESS;
}
en dev pascal svp
#!/usr/bin/env python
# -*- coding: utf-8 -*-

print("Affichage des nombres parfaits inférieurs ou égaux à un nombre entier strictement positif\n")

n = int(input("Entrez un nombre positif:"))

np=0
a=0
c=0

while (np<n):
np = np+1 #chaque nombre np sont vérifier dans une bouche pour savoir s'ils sont parfait
while(a<np-1):
a = a+1 #a est un compteur pour vérifier les entier d'un nombre
b = np%a #b est le vérificateur de diviseur entier
if(b==0):
c = a+c #c est la somme des diviseurs du nombre np
if(c==np): #lorsque la somme des diviseurs du nombre np = au nombre np c'est un nombre parfait
print(np,end = " ")
a = 0 #reset la valeur de a et c pour l'évaluation du prochain nombre np
c = 0



input("\n\nTapez sur une touche pour quitter!")

J'ai fait ça dans le cadre de mon cours avec le langage python

merde ça justifie mon texte à gauche, fak on voit pas l'indentation.....
Messages postés
16307
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
15 avril 2021
2 820
Pour l'indentation il y a les balises de code comme expliqué par Bilow un peu plus haut.
(le bouton est à côté de gras, italique et souligné)

<code> 
    Ton code indenté
</code>
#!/usr/bin/env python 
# -*- coding: utf-8 -*-  

print("Affichage des nombres parfaits inférieurs ou égaux à un nombre entier strictement positif\n") 

n = int(input("Entrez un nombre positif:")) 
while(n<=0): 
    print("Pas de nombre négatif ou nul") 
    n = int(input("Entrez un nombre positif:")) 

np=0 
a=0 
c=0 

while(np<n): 
    np = np+1   #chaque nombre np sont vérifier dans une bouche pour savoir s'ils sont parfait 
    while(a<np-1): 
        a = a+1      #a est un compteur pour vérifier les entier d'un nombre 
        b = np%a      #b est le vérificateur de diviseur entier 
        if(b==0): 
            c = a+c      #c est la somme des diviseurs du nombre np 
    if(c==np): #si la somme des diviseurs du np = np c'est un nombre parfait 
        print(np,end = " ") 
    a = 0 #reset la valeur de a et c pour l'évaluation du prochain nombre np 
    c = 0 



input("\n\nTapez sur une touche pour quitter!")