Probleme d'affichage de message [Résolu]

- - Dernière réponse : cptpingu
Messages postés
3801
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 novembre 2019
- 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;
}
Afficher la suite 

6 réponses

Meilleure réponse
Messages postés
3801
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 novembre 2019
90
1
Merci
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

Dire « Merci » 1

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 6035 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cptpingu
0
Merci
Problème résolu
Merci ^_^
Commenter la réponse de Ca.marchera
Messages postés
3801
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 novembre 2019
90
0
Merci
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
Commenter la réponse de cptpingu
0
Merci
bsr
ok ^_^ vous avez raison
Commenter la réponse de Ca.marchera
0
Merci
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;
}

Commenter la réponse de Ca.marchera
Messages postés
3801
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 novembre 2019
90
0
Merci
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
Commenter la réponse de cptpingu