Probleme d'affichage de message

Résolu
Ca.marchera - 29 janv. 2015 à 13:56
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 - 30 janv. 2015 à 14:37
Bonjour,
mon Code s'exécute correctement mais j'arrive pas a afficher le dernier message comme l est demandé dans l'énoncé
Any Help ?
Merci d'avance

l'énoncé :

On se propose de chercher les entiers dans un intervalle [m,n] admettant le plus grand nombre de diviseurs. Les entiers m et n doivent vérifier la condition suivante: 5<=m<n<=100.
Ecrire un algorithme permettant de chercher puis d'afficher le plus grand nombre de diviseurs et les entiers appartenant à l'intervalle [m,n] ayant ce nombre de diviseurs.
Exemple :
Pour m= 5 et n=10
Entier à comme nombre de diviseurs
5 2
6 4
7 2
8 4
9 3
10 4


L'algorithme affichera : les entiers admettant le plus grand nombre de diviseurs : 4 sont : 6, 8, 10.


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

int main()
{
    int i,j,nb=0,max,m,n;
    int tab [50];
do{


  do
  {
      printf("donnez le min de l intervalle n \n ");
      scanf("%d",&n);

  }while(n<5);

  do
  {
      printf("donnez le max de l intervalle m \n ");
      scanf("%d",&m);

  }while (m>100);

}while(n>m);
 int size=n;
for (i=n;i<=m;i++)

{ for(j=1;j<=i;j++)
   {
        if(i%j==0)
    {
        nb++;
    }
   }
   tab[size]=nb;

   printf("t[%d]=%d \n ",size,nb);
   size++;
   nb=0;

}
max=0;
for (i=n;i<=m;i++)
{
    if (tab[i+1]>=tab[i])
    {
        max=tab[i+1];
    }
}  

    return 0;
}

6 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 29/01/2015 à 15:45
Bonjour.

Tout d'abord, essaie de découper ton code en petite fonction, au lieu d'avoir une grosse fonction.
Quand tu as un problème difficile, il faut le couper en petites fonctions "faciles". C'est là le secret pour bien réussir.

Au niveau de ton code, quand tu recherches le "max", il faut comparer avec l'ancien "max", et non comparer si la case du tableau courante est plus grand que la précédente.
Exemple: 1 2 3 4 5 => ton algo fonctionne. 5 4 3 2 1 => ton algo ne fonctionne plus. 5 7 1 2 9 8 3 => Ne fonctionnera pas non plus.

Ensuite, tu refais une passe sur ton tableau, en n'affichant que les nombres qui ont exactement "max" diviseurs.

__________________________________________________________________________________________________

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
Problème résolu
Merci ^_^
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
29 janv. 2015 à 17:08
Si tu as résolu ton souci, n'oublie pas de poster comment tu as fait. Ainsi, si quelqu'un a le même problème que toi, il sera content d'avoir la solution (et pas seulement savoir que toi tu as réussi).
Merci :).

__________________________________________________________________________________________________

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
bsr
ok ^_^ vous avez raison
0

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

Posez votre question
Ma solution (sans utiliser des simples fonctions)

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

int main()
{
    int i,j,nb=0,max,m,n;
    int tab [50];
do{


  do
  {
      printf("donnez le min de l intervalle n \n ");
      scanf("%d",&n);

  }while(n<5);

  do
  {
      printf("donnez le max de l intervalle m \n ");
      scanf("%d",&m);

  }while (m>100);

}while(n>m);
 int size=n;
for (i=n;i<=m;i++)

{ for(j=1;j<=i;j++)
   {
        if(i%j==0)
    {
        nb++;
    }
   }
   tab[size]=nb;

   size++;
   nb=0;

}
max=0;
for (i=n;i<=m;i++)
{
    if (tab[i]>=max)
    {
        max=tab[i];
    }
} printf("les entiers admettant le plus grand nombre de diviseurs : %d sont :",max);

for (i=n;i<=m;i++)
{
    if (tab[i]== max)
        printf("%d %c",i,32);
}
    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 30/01/2015 à 14:38
Cette solution a quelques soucis:
- La tableau est trop petit (50 alors qu'on peut avoir jusqu'à 95 nombres)
- En faisant commencer l'index size à n, il y a des "trous" dans le tableau (ce n'est pas une erreur, mais ça gâche un peu de place, c'est dommage).

Voici une solution propre (pas la meilleure car on pourrait faire moins de "passe", mais je ne veux pas rendre ça trop compliqué):
#include <stdio.h>
#include <stdlib.h>

int askN()
{
  int n = 0;

  do
  {
    printf("Donnez le min de l'intervalle n: ");
    scanf("%i", &n);
  }
  while (n < 5);

  return n;
}

int askM()
{
  int m = 0;

  do
  {
    printf("Donnez le max de l'intervalle m: ");
    scanf("%i", &m);
  }
  while (m > 100);

  return m;
}

void askRange(int* n, int* m)
{
  do
  {
    *n = askN();
    *m = askM();
    if (*m < *n)
      printf("Invalid range m(%i) < n(%i)\n", *m, *n);
  }
  while (*m < *n);
}

int getNbDivisor(int number)
{
  int i = 0;
  int nb_divisor = 0;

  for (i = 1; i <= number; i++)
    if (number % i == 0)
      nb_divisor++;

  return nb_divisor;
}

void fillDivisorTable(int tab[128], int n, int m)
{
  int i = 0;
  for (i = n; i <= m; i++)
    tab[i - n] = getNbDivisor(i);
}

int searchMax(int tab[128], int size)
{
  int max = 0;
  int i = 0;
  for (i = 0; i < size; i++)
    if (tab[i] > max)
      max = tab[i];

  return max;
}

void printBest(int tab[128], int n, int m, int max)
{
  int i = 0;

  printf("Les entiers admettant le plus grand nombre de diviseurs %d sont :",max);
  for (i = n; i <= m; i++)
    if (tab[i - n] == max)
      printf("%d ", i);
  printf("\n");
}

int main()
{
  int m = 0;
  int n = 0;
  int max = 0;
  int tab[128] = {0};

  askRange(&n, &m);
  fillDivisorTable(tab, n, m);
  max = searchMax(tab, m - n);
  printBest(tab, n, m, max);

  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
Rejoignez-nous