Nombres parfaits

Résolu
Ca.marchera Messages postés 11 Date d'inscription jeudi 22 janvier 2015 Statut Membre Dernière intervention 22 juillet 2015 - Modifié par cptpingu le 23/01/2015 à 10:34
 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.

7 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
Modifié par cptpingu le 23/01/2015 à 11:02
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
1
Bonsoir
Merciiiii cptpingu je vais essayer votre méthode ^_^
0
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;
}
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
Modifié par cptpingu le 29/01/2015 à 11:43
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
0

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

Posez votre question
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 ? :/ :/
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
Modifié par cptpingu le 29/01/2015 à 11:52

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
0
Merciiiiiiiiiiiiiiiiiiiiiiiiiiiii infiniment cher cptpingu
enfinn ^_^
0
Rejoignez-nous