Nombre parfait

Fermé
cari - 2 nov. 2007 à 11:51
 orangeworx - 17 nov. 2008 à 07:50
Bonjour,
mon programme ( en c) doit rechercher les nombres parfait <= 500, pour chacun d'eux il affiche le nombre ainsi que l'ensemble de ses diviseurs présenté sous forme d'addition

je n'arrive pas à continuer quelqu'un pourrait m'aider merci
#include <stdlib.h>
#include <stdio.h>

void main (void)

{
int nombre,s,sdiv,div;
do
{
printf("entrez nombre");
scanf("%d",&nombre);


}while ( nombre <=500);

while(div%nombre == 0)




s=0;

if(sdiv == nombre)
{
printf(" le nombre est parfait");
}
else
printf("il n'est pas parfait");

6 réponses

Bonjour,

#include<stdio.h> // appel des librairies entrées/sortie standart dc le printf et le scanf

void main (void)
// le premier void =ce que va retourner ton cade à la fin de son execution dc rien et le 2nd void= les
parametres d'entrée de ton programme: rien.



{ int nombre,i, sdiv; // declaration de tes variables que des entiers

//maintenant on passe à la saisie et à l'interface avec l'utilisateur. On veut que l'utilisateur saisisse un nombre entier

printf("\ntapez votre nombrer:");
scanf("%d",&nombre); //le nombre saisie va etre enregistré sous la variable : nombre
.
.
.

jusque là c'est ce que tu as fait donc je t'aprend rien.

je te propose de découper ton programme en 2 idées:
1) faire la boucle pour savoir si ton nombre est premier ou pas.

2) faire la boucle pour la saisie utilisateur

NOMBRE PARFAIT ?

sdiv=0; // unitialisation de la variable sdiv

for (i=(nombre -1);i>0; i--) //permet de verifier tous les multiples de nombre
{
if (nombre%i ==0)
{ sdiv=sdiv+i;} // somme des multiples}

if (nombre==sdiv)
{printf ("%d est un nombre parfait",nombre);}

}

ceci nous dit si le nombre saisie est parfait ou pas mais cela s'applique que pour une seule entrée pour faire ce test sur différent nombre il faut faire une boucle qui engloge la fonction nombre parfait.



2) SAISIE UTILISATEUR

on demande un nombre tanque la valeur saisie est <=500. si tu tape 501 la saisie du nombre s'arrète.

pour celà il suffit de faire une boucle sur la saisie .
while (nombre <= 500)
{
printf("\ntapez votre nombre:");
scanf("%d",&nombre);
}

ok celà marche mais ne nous avance pas plus. Il faut plutot ecrire les choses de cette manière:


printf("\ntapez votre nombre:"); //session d'amorçage initialle du programme
scanf("%d",&nombre);

while (nombre <= 500) //si le premier nombre saisie est inferieur à 500 alors je rentre dans la boucle
{

sdiv=0;
for (i=(nombre -1);i>0; i--)
{
if (nombre%i ==0)
{ sdiv=sdiv+i;}
}
//fermeture du FOR
if (nombre==sdiv)
{
printf ("%d est un nombre parfait",nombre);
else
printf ("%d n'est pas un nombre parfait",nombre);

}
//fermeture du IF

printf("\ntapez votre nombre:"); //session d'amorçage pour les autres valeurs que va prendre nombre si >500 le
programme prendra fin sinon on calcule de nouveau le sdiv et on verifie si nbr est
parfait ou pas.


scanf("%d",&nombre);
}
fermeture du WHILE

printf("\n FIN DU PROGRAMME\n);
}
fermeture du MAIN
5
Bonjour,

tout d'abord mettre un #include<stdlib.h> n'est absolument pas utile puisque les seules fonctions dont tu fais appel sont les fonction standard d'entrée sortie printf et scanf.

Tu as un probleme dans ta boucle de départ. Si tu regarde bien tu demandes à ton programme de faire une boucle tanque nombre<= à 500.
mais peux tu me dires ou vont tous tes chiffres tappés?

ils sont à chaque fois écrasés par la nouvelle valeur que tu entres pour ton nombre.

il n'y a donc pas raison pour l'instant d'y avoir une boucle.



while(div%nombre == 0) fourni aucune information à ton programme car la seule information que prend en compte ton compilateur est l'inscription qui viens après : s=0;

non mais les accolades ça sert à quelque chose quand même§§§


Ton script doit te retourner plains d'erreur il faut le reprendre.

Si tu veux bien je peux te proposer un raisonnement pour savoir ce que doit faire ton programme avant de le créer et tu veras qu'après c'est pure question de syntaxe et un vrai jeu d'enfant.

JE PEUX T'AIDER SI TU VEUX

ps: je pense que si je te donne la réponse sans t'expliqué celà servirais à rien et tu aura rien compris à la programmation en C.

si tu veux que la correction de ton pb fait moi le savoir.
2
bonjour, je veux bien le raisonnement!
merci
1
tarek_dotzero Messages postés 817 Date d'inscription jeudi 19 juillet 2007 Statut Membre Dernière intervention 12 avril 2022 121
3 nov. 2007 à 10:19
Bonjour,
Si je ne me trompe pas: un nombre parfait = la somme de ses diviseurs (sauf lui même) 6 = 1 + 2 + 3, autrement ce n'est pas la peine de lire la suite:
Comme j'ai dit, si je ne me trompe pas: l'objectif est d'afficher non pas de sauvegarder: donc tu peux:
1. creer une fonction qui cherche tous les diviseurs et les met dans un tableau, et au même temps elle calcule leur somme.

C'est la seule fonction nécessaire: ton programme sera:

Une boucle allant de 1 à 500
pour chaque i: appliquer la fonction
Si i = la_somme
ecrire "%d =",i
une boucle qui ecrit à chaque fois un element de la table et +

L'essentiel, c'est ça le raisonnemment, si tu veux une aide sur le code, il suffit de le demander.
1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
je pense avoir compris et je veux bien une aide sur le code
merci
1
j'essaie de faire qqchose de similaire ds le sens ou je ne verifie pas un seul nombre comme ici
on nous demande de saisir un nombre d'entier... celui ci est pour creer un tableau ou l'usager entrera des nombres pour combler le tableau. ensuite une boucle est necessaire pour calculer si les cases du tableau (une a une) sont des nombres parfaits.

j'ai ce code mais je me suis plante et sais plus quoi faire


#include <stdio.h>

main()

{
// initialisation des variables
int nbrMax; // Nbr d'entiers à saisir
int tableauNbr[nbrMax]; // Tableau pour contenir les nombres entrés par l'usager
int i; // Compteur boucle
int j, k, somme; // variables pour calcul nbr parfait
char condition; // Oui ou Non

// Boucle do ... while, pour ne pas devoir repartir le programme pour chaque calcul
do
{
printf ("Entrez le nombre d'entier (Max 10):\n");
scanf ("%d", &nbrMax);

// boucle pour la saisie des nombres et remplissage le tableau.
for (i = 0; i < nbrMax; i++)
{
scanf ("%d", &tableauNbr[i]);
}

// Calculs pour trouver les nombres parfaits
somme = 0;
for (j = 0; j < nbrMax; j++)
{
for (k = 1; k < tableauNbr[j]; k++)
{
if(tableauNbr[j]%k==0)
{
somme += k;
}
}
// Affichage des resultats
if (somme = tableauNbr[j])
printf("%d est un nombre parfait\n", tableauNbr[j]);
else
printf("%d n'est pas un nombre parfait\n", tableauNbr[j]);

}




// Condition requise pour repartir du début
printf ("\nVoulez vous faire un autre calcul, (o/n)?");
fflush (stdin); // Fonction pour vider stdin
condition = toupper(getchar()); // Capitaliser la letter et soumettre à condition
}
while ( condition == 'O'); // Repartir du début si O

system("pause") ;
}



merci pour l'aide
1