Nombre parfait

cari -  
 orangeworx -
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");
Configuration: Windows XP
Internet Explorer 6.0

6 réponses

  1. tania
     
    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
  2. Tania
     
    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
  3. cari
     
    bonjour, je veux bien le raisonnement!
    merci
    1
  4. tarek_dotzero Messages postés 834 Statut Membre 122
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. cari
     
    je pense avoir compris et je veux bien une aide sur le code
    merci
    1
  7. orangeworx
     
    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