Nombres parfaits [Résolu]

Ca.marchera 12 Messages postés jeudi 22 janvier 2015Date d'inscription 22 juillet 2015 Dernière intervention - 23 janv. 2015 à 00:23 - Dernière réponse :  Ca.marchera
- 29 janv. 2015 à 13:15
Salut
l'exécution de mon programme n'est pas juste pouvez vous me trouvez une solution svp?
merci d'avance

énoncé
Un nombre parfait est un nombre présentant la particularité d'être égal à la somme de tous ses
diviseurs, excepté lui-même. Le premier nombre parfait est 6 = 3 + 2 + 1.
Ecrire un programme C qui affiche tous les nombres parfais inférieurs à 1000.


Mon programme
#include <stdio.h>
#include <stdlib.h>

int main()
{
int n=1,j,i,a,b,somme,nb=0;
int t[100];
do{
    for(j=0;j<n;j++)
    {
        for(i=1;i<=n;i++)
        {
            a=n%i;
            b=n/i;
              if (a==0)
                {
                t[j]=b;
                nb++;

                }
        }
    }

 somme=0;
    for(j=0;j<nb;j++)
    {
        somme=somme+t[j];
    }
    if (somme=2*n)
    {
        printf("\n le nombre %d est parfait \n",n);
    }
    n++;
}while(n<1000);

    return 0;
}


EDIT: Ajout de la coloration syntaxique.
Afficher la suite 

Votre réponse

7 réponses

Meilleure réponse
cptpingu 3808 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 24 septembre 2018 Dernière intervention - Modifié par cptpingu le 23/01/2015 à 11:02
1
Merci
Bonjour.

Plutôt que d'essayer de faire les 1000 nombres en même temps, essaie plutôt de trouver si un seul nombre (que l'on te donne) est parfait. Une fois que ça fonctionnera pour un, ça fonctionnera pour tous.

Je te propose cette méthode:
- Crée une fonction qui prend en argument un tableau et sa taille, qui additionne tous ses éléments, et en retourne la somme.
- Crée une fonction qui dit si un nombre est parfait.
* Au sein de cette fonction, trouver tous les diviseurs du nombre et les stocker.
* Grâce à la fonction de sommage, vérifier que le somme des diviseurs est égale au nombre
- Faire une boucle de 1 à 1000, et relancer la fonction qui dit si un nombre est parfait pour les valeurs comprise entre 1 et 1000.

Début de code:
#include <stdio.h>
#include <stdlib.h>

int sum_of(int tab[100], int size)
{
  int res = 0
  // À faire: retrourner la somme de tous les élements du tableau.

  return res;
}

int is_perfect(int nb)
{
   int tab[100];
   int sum = 0;
   int size = 0;

   // Rechercher ici tous les diviseurs de "nb", et les stocker dans "tab"

  sum = sum_of(tab, size);
  return // ? vérifier si "sum" est égal au nombre "nb"
}

int main()
{
  int i = 0;
  for (i = 1; i <= 1000; ++i)
    if (is_perfect(i))
      printf("\n le nombre %d est parfait \n", i);

    return 0;
}



__________________________________________________________________________________________________

Améliorez votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature

Merci cptpingu 1

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de cptpingu
Ca.marchera - 27 janv. 2015 à 21:49
0
Merci
Bonsoir
Merciiiii cptpingu je vais essayer votre méthode ^_^
Commenter la réponse de Ca.marchera
Ca.marchera - 27 janv. 2015 à 23:36
0
Merci
Re-Salut
j'ai le même problème :( ça marche pas comme il faut

#include <stdio.h>
#include <stdlib.h>

int sum_of(int tab[100], int size)
{
  int j,res = 0;
      for(j=0;j<size;j++)
    {
        res=res+tab[j];
    }
  return res;
}

int is_perfect(int nb)
{
   int tab[100];
   int sum = 0;
   int size = 0;
   int a,b,i,j;

   // Rechercher ici tous les diviseurs de "nb", et les stocker dans "tab"

    for(j=0;j<nb;j++)
    {
        for(i=1;i<nb;i++)
        {
            a=nb%i;
            b=nb/i;

        }
         if (a=0)
                {
                tab[j]=b;
                size++;
                }
    }


  sum = sum_of(tab, size);

  if (sum==nb)

   return (1);
  else
   return (0);
  //? vérifier si "sum" est égal au nombre "nb"
}

int main()
{
  int i;
  for (i = 1; i <= 1000;i++)
    if (is_perfect(i))
      printf("\n le nombre %d est parfait \n", i);

    return 0;
}
Commenter la réponse de Ca.marchera
cptpingu 3808 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 24 septembre 2018 Dernière intervention - Modifié par cptpingu le 29/01/2015 à 11:43
0
Merci
C'est presque bon. Ton erreur est d'utiliser deux boucles imbriquées, alors qu'une seule est nécessaire. Pour mettre un élément dans la dernière case "valide" de ton tableau tab, ce n'est pas une boucle qu'il te faut, met te "souvenir" de la prochaine position valide.
Ton but est d'ajouter au tableau, un nouvel élément. Tu connais la taille que tu mets à jour via "size".
Donc il est facile, à partir de là, de trouver la position de la nouvelle case de "tab".

J'ai corrigé et mis au propre ton code, et je te laisse réfléchir, pour trouver ce qu'il reste.
#include <stdio.h>
#include <stdlib.h>

int sum_of(int tab[100], int size)
{
  int j = 0;
  int res = 0;
  for (j = 0; j < size; j++)
        res += tab[j];

  return res;
}

int is_perfect(int nb)
{
   int tab[100];
   int sum = 0;
   int size = 0;
   int j = 0;

   // Rechercher ici tous les diviseurs de "nb", et les stocker dans "tab"
    for (j = 1; j < nb; j++)
    {
        if (nb % j == 0) // Si "nb" est un divisible par "j"
       {
            tab[?] = j; // Remplacer ? par ce qu'il faut. Je te laisse réfléchir.
            size++; // On a trouvé une nouvelle valeur, donc la taille du tableau augmente
        }
    }

  sum = sum_of(tab, size);

  return sum == nb; // On retourne si la "sum" est égale au nombre "nb" lui même. Ca retourne automatiquement "vrai" ou "faux".
}

int main()
{
  int i;
  for (i = 1; i <= 1000; i++)
    if (is_perfect(i))
      printf("\n le nombre %d est parfait \n", i);

    return 0;
}

__________________________________________________________________________________________________

Améliorez votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
Commenter la réponse de cptpingu
Ca.marchera - 29 janv. 2015 à 11:35
0
Merci
Bonjour
j'ai essayé tab [j-2] et tab [size] et ça n'a pas marché
mes 2 essais sont débiles n'est ce pas ? :/ :/
Commenter la réponse de Ca.marchera
cptpingu 3808 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 24 septembre 2018 Dernière intervention - Modifié par cptpingu le 29/01/2015 à 11:52
0
Merci

tab[j-2]

Ce n'est pas bon car tu vas avoir des "trous" dans ton tableau. Ce que tu veux, c'est aller à la dernière case possible.
Dernière position du tableau => La "taille - 1". Comme size n'est pas encore incrémenté on peut écrire:
tab[size] = j;
size++;


Ou encore:
size++;
tab[size - 1] = j;


Donc tu avais bien trouvé la solution :). En fait, il y avait une petite coquille dans ce que je t'avais envoyé. J'avais mis "for (j = 2" au lieu de "for (j = 1", et donc forcément il manquait le 1 partout, qui est un diviseur important.

Voici le code complet:
#include <stdio.h>
#include <stdlib.h>

int sum_of(int tab[100], int size)
{
  int j = 0;
  int res = 0;
  for (j = 0; j < size; j++)
    res += tab[j];

  return res;
}

int is_perfect(int nb)
{
  int tab[100];
  int sum = 0;
  int size = 0;
  int j = 0;

  // Rechercher ici tous les diviseurs de "nb", et les stocker dans "tab"
  for (j = 1; j < nb; j++)
  {
    if (nb % j == 0) // Si "nb" est un divisible par "j"
    {
      tab[size] = j;
      size++; // On a trouvé une nouvelle valeur, donc la taille du tableau augmente
    }
  }

  sum = sum_of(tab, size);

  return sum == nb; // On retourne si la "sum" est égale au nombre "nb" lui même. Ca retourne automatiquement "vrai" ou "faux".
}

int main()
{
  int i;
  for (i = 1; i <= 1000; i++)
    if (is_perfect(i))
      printf("\n le nombre %d est parfait \n", i);

  return 0;
}


__________________________________________________________________________________________________

Améliorez votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
Commenter la réponse de cptpingu
Ca.marchera - 29 janv. 2015 à 13:15
0
Merci
Merciiiiiiiiiiiiiiiiiiiiiiiiiiiii infiniment cher cptpingu
enfinn ^_^
Commenter la réponse de Ca.marchera

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 et codes sources.

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