Posez votre question Signaler

Programme pour nombre parfait

mounirovic 21Messages postés dimanche 23 octobre 2005Date d'inscription 17 mars 2009Dernière intervention - Dernière réponse le 10 déc. 2012 à 12:52
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
Lire la suite 
Réponse
+9
moins plus
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)...
marie- 30 déc. 2011 à 14:13
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 ^^^^
Répondre
KX 11495Messages postés samedi 31 mai 2008Date d'inscription ContributeurStatut 4 mai 2015Dernière intervention - 30 déc. 2011 à 18:50
J'ai déjà posté un code en C mais sur un autre post, regarde Langage C, Nombre parfait
Répondre
Ajouter un commentaire
Annonces
 
moins plus
Réponse
+4
moins plus
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
KX 11495Messages postés samedi 31 mai 2008Date d'inscription ContributeurStatut 4 mai 2015Dernière intervention - 20 sept. 2011 à 11:39
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...
Répondre
mustapha- 22 déc. 2011 à 02:11
merci pour l'information
Répondre
Ajouter un commentaire
Annonces
 
moins plus
Réponse
+4
moins plus
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 ?
Ajouter un commentaire
Réponse
+2
moins plus
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
sfel 1651Messages postés lundi 18 juin 2007Date d'inscription 15 juillet 2009Dernière intervention - 18 janv. 2008 à 20:19
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

Répondre
Ajouter un commentaire
Réponse
+2
moins plus
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
Ajouter un commentaire
Réponse
+2
moins plus
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;
}
Ajouter un commentaire
Réponse
+0
moins plus
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");
}
}
}
}
hamza- 15 mars 2008 à 20:16
té null !!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Répondre
sfel 1651Messages postés lundi 18 juin 2007Date d'inscription 15 juillet 2009Dernière intervention - 15 mars 2008 à 20:25
et toi tu propose koi ?
Répondre
hamza- 15 mars 2008 à 22:57
reee sfel jété hors home
bon att donne moi 5 min
Répondre
hamza- 15 mars 2008 à 23:09
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 ();

}

}
Répondre
Ajouter un commentaire
Réponse
+0
moins plus
#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;
}
Ajouter un commentaire
Réponse
+0
moins plus
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;
}
Ajouter un commentaire
Réponse
+0
moins plus
Ajouter un commentaire
Réponse
+0
moins plus
#!/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.....
KX 11495Messages postés samedi 31 mai 2008Date d'inscription ContributeurStatut 4 mai 2015Dernière intervention - 19 sept. 2011 à 07:50
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>
Répondre
Gui3dmaster- 20 sept. 2011 à 03:38
#!/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!") 
Répondre
Ajouter un commentaire
Réponse
+0
moins plus
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.
Ajouter un commentaire
Ce document intitulé «  programme pour nombre parfait  » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.