Comment trouver les diviseurs d'un nombre a partir de tableaux?

Fermé
yasminaaaaa Messages postés 1 Date d'inscription dimanche 20 janvier 2013 Statut Membre Dernière intervention 20 janvier 2013 - 20 janv. 2013 à 10:57
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 - 24 janv. 2013 à 22:22
Bonjbonjour j'aimerai que vous m'aidiez a resoudre la derniere question( celle sur la liste diviseurs je crois qu'il faut ajouter un autre tableau mais je ne sais pas comment!!) de cet algorithme merci d'avance pour toutes vos reponses!!!

Ecrire un algorithme qui permet de
-saisir un entier N>1
-Remplir le tableau facteurs par tous ces facteurs premiers
-remplir a base du tableau facteurs,deus tableaux FD et Puissances: Le tableau FD (facteurs distinct)contiendra les differents facteurs premiers distincts de N
Le tableau Puissances est donne par Puissance[i]=nombre de repetitions du facteur FD[i] dans le tableau Facteurs ex N=720 facteurs=[2,2,2,2,3,3,5] FD=[2,3,5] Puissance=[4,2,1]
-Affiche la liste des diviseurs de N :cette liste doit etre deduite des deux tableaux FD et Puissances cest toutes les combinaisons obtenues en incrementant les exposants des facteurs FD[i] de zero jusqu'au nombre Puissance[i] ex 45=3².5 les diviseurs sont 3°5° ,3°5^1, 3^1.5^1,3².5°,3²*.5^1 our,


alors voici la partie que j'ai fait il ne manque plus que la derniere question alors si vous pouviez m'aider ne serais-ce que me donner une indication ce serait cool

#include<stdio.h>
#include<math.h>

int N,i,k,l,m,j,p,puissance;
int Facteurs[100],FD[100],Puissances[100];

int main()
{
printf(" Affichage des diviseurs d'un entier ");
printf("\nEntrer un entier strictement supérieur a 1 : ");
scanf("%d",&N);
if(N<=1)
printf("\nSaisie Incorrecte ");
else
{
i=0;
while(N!=1)
{ k=2;
while(N%k!=0)
{ k++;
Facteurs[i]=k;
i++; }
}
i=i-1;
for(j=0;j<=i;j++)
FD[j]=Facteurs[j];
for(j=0;j<=i;j++)
for(l=j+1;l<=i;l++)
if(FD[j]=FD[l])
{ for(m=l;m<=i-1;m++)
FD[m]=FD[m+1]; }

j=0;
p=0;
while(j<=i)
{ puissance=1;
for(l=j+1;l<=i;l++)
{ if(Facteurs[l]=Facteurs[j])
puissance=puissance+1; }
Puissances[p]=puissance;
p=p+1;
j=j+puissance; }


}
getch();
}




1 réponse

mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
24 janv. 2013 à 22:22
Quelques remarques préalables :

- Déclare tes variables dans ton main, pas à l'extérieur. Sinon ce sont des variables globales et de manière générale, on essaye d'éviter les variables globales dans un programme. Par ailleurs ta fonction main retourne un int (0 par convention quand tout va bien), donc il faut rajouter le return qui correspond.

Exemple :

int main() {
  int x, y;
  return 0;
}


- Par soucis de lisibilité, on passe à la ligne après une accolade ouvrante et une accolade fermante. Certains passent même une ligne avant d'ouvrir une accolade. Ça permet de voir plus facilement où les blocs commencent et s'arrête. À partir du moment où tu ouvres une accolades, tu es sensé ajouter une tabulation pour qu'on voit qu'on est dans un bloc { ... }

Exemple :

for(i = 0; i < 10; i++) {
  for(j = 0; j < 10; j++) {
    printf("%d * %d = %d\n", i , j, i * j);
  }
}


- Pour la saisie d'un entier > 1 je répéterais la valeur de N tant que N n'est pas > 1 :

int n;
do {
  printf("Veuillez saisir une valeur de N > 1\n");
  scanf("%d", &n);
} while (n <= 0);

// À partir de là, je sais que j'ai n > 1


Pour la dernière étape, le plus simple est à mon avis d'écrire une fonction récursive qui étant donnés en paramètre
- une décomposition en nombre premiers
- un rang i (qui signifie que tous les facteurs 0 à i -1 ont été évalués)
- une valeur f engendrée par les facteurs de rang 0 à i - 1
...
fait le traitement suivant : pour chaque valeur de p allant de 0 à puissance[i] - 1
si i < n (avec n le nombre de facteurs) appeler récursivement cette fonction
- la même décomposition
- i+1
- f * facteur[i] ^ p
si i == n affiche la valeur de f.

Bonne chance
0