Code C avec tableau flou.. - Code pour determination nombre premier

Bonjour les amis…
Je suis toujours débutant et j’ai l’air ne plus pouvoir dépasser cette phase :lol:
Bref je cherche un résoudre un petit problème : énumerer les nombres premiers entre 2 et un seuil (n) donné par l’utilisateur (dans un tableau) moyennant la méthode ‘crible d’Erastotène’ qui consiste en :

  • On barre 1 (n’est pas premier).
  • On barre ensuite tous les multiples de 2 : 4, 6, 8, 10, …
  • Le nombre qui suit, 3, est donc premier. On barre tous ses multiples : 6, 9, 12, …
  • Le nombre qui suit, 5 (car 4 a été barré car il est mutliple de 2), est donc premier. On barre tous ses multiples : 10, 15, 20, 25, …
  • On continue ansi jusqu’à la fin du tableau.
    Pour finir, on obtient uniquement des nombres premiers.

voilà mon code bête :

/* nombres premiers compris en 2 et N */
#include<stdio.h>
#include<conio.h>
main()
{
      int n, i, j;
      int T[n];
      
      printf("Entrer n : ");
      scanf("%d",&n);
      printf("\n\n");

	/* Remplissage et Impression du tableau de 1 à n */
	/* pour le visualiser avant traitement */

	for(i=0; i<n; i++)
	T[i]=i+1;
	for(i=0; i<n; i++)
	printf(" %7d ",T[i]);
	printf("\n\n");

      if(n==0 || n==1)
         printf("%d n'est pas premier et n'existe aucun nombre premier",n);

	/* Debut de traitement du tableau */

	/* Le nombres 1 n'est pas premier */
	T[0]=0;
	/* On efface les multiples de 2 et les autres nombres composés */    
      i = 2;
          while(i<=n)
          {
                 j = i*2;
                 while(j<=n)
                 {
                     T[j]=0;
                     j+=i;
                 };
                 i++;
                 while((i<=n)&&(T[i]==0))
                 i++; 
                 printf(" %7d ",T[i]);   
          }    
      
      getch();
      return 0;
}
                                                

Mais ça ne marche pas, quelque chose cloche, merci d’avance pour votre aide…

Désolé, je n’ai pas le temps d’étudier de façon approfondi ton code, je peux juste te dire en speed que la taille de ton tableau est mal déclarée, tu lui files n comme alors alors que sa valeur n’a pas encore été précisée, c’est le segmentation fault assuré.

Solution pour avoir la bonne taille: allocation dynamique avec malloc() après avoir récupéré le nb de valeurs (n)

Bon courage.

Bonjour,
oui c’est ça, dans n’importe quel language, quand on utilise une variable qui n’est pas affectée il y a un problème :smiley: :


      int n, i, j;//là "n" n'a aucune valeur prédéfinie (potentiellement n'importe quoi)

      int T[n]; // là on essaye de l'utiliser

en plus, la syntaxe que tu utilise est une affectation statique de tableau, il en faut une dynamique quand on ne connait la taille qu’à l’exécution:

/* nombres premiers compris en 2 et N */
#include<stdio.h>
#include<conio.h>
main()
{
      int n, i, j;

      int * T; // tableau dynamique
      
      printf("Entrer n : ");
      scanf("%d",&n);
      printf("\n\n");
      T = malloc(n*sizeof(int));//allocation du tableau

voilà, le reste a l’air plutot OK :slight_smile:

edit: n’oublie pas de “free(T)” ton tableau quand tu n’en a plus besoin, sous risque de créer des fuites mémoire (m’enfin, quand je fait du Java, je me pos pas ces problèmes :ane: )

Au sinon l’autre solution un peu limite de la declaration d’un tableau c’est de mettre

int T[500];

500 est la taillle du tableau
la commande malloc permet de declarer un tableau dont la taille n’est pas connu pendant la compilation
Cela peut etre utile si tu demande la taille a l’utilisateur

De plus lorsque on declare le tableau avec malloc la seule limite de taille est la taille de ta memoire vive

Pour la declaration statique que je viens d’expliquer pas besoin de faire free(T);

Voila

Re les gars,
Merci pour vos conseils, ok après avoir corrigé l’erreur que vous m’avez signalé (j’ai mis simplement int T[500], le programme compile bien et donne un résulat à l’execusion, mais c’est pas un bon résultat… ça ne réponds pas à ma question qui est de trouver les nombres premiers entre 2 et n (100 par exemple)…
Merci encore une fois d’avance pour votre aide…
a+

Peux-tu nous afficher la nouvelle version de ton programme ?

Il faut initialiser ton tableau avant le traitement, sinon il risque de contenir uniquement des zéros et de boucler jusqu’à la fin sur while((i<=n)&&(T[i]==0))

donc un petit for avant, et tu met 1 100 ou i dans tout le tableau, nimporte, pourvu que ce soit différent de 0.

ou memset() :slight_smile:

Re bonjour ;
ci joint le code, je cherche à traduite l’algo cité ci-dessus :
On barre 1 (n’est pas premier).

  • On barre ensuite tous les multiples de 2 : 4, 6, 8, 10, …
  • Le nombre qui suit, 3, est donc premier. On barre tous ses multiples : 6, 9, 12, …
  • Le nombre qui suit, 5 (car 4 a été barré car il est mutliple de 2), est donc premier. On barre tous ses multiples : 10, 15, 20, 25, …
  • On continue ansi jusqu’à la fin du tableau.
    Pour finir, on obtient uniquement des nombres premiers.
/* nombres premiers compris en 2 et N */
#include<stdio.h>
#include<conio.h>
main()
{
      int n, i, j;
      int T[500];
      
      printf("Entrer n : ");
      scanf("%d",&n);
      printf("\n\n");

	/* Remplissage et Impression du tableau de 1 à n */
	/* pour le visualiser avant traitement */

	for(i=0; i<n; i++)
	T[i]=i+1;
	for(i=0; i<n; i++)
	printf(" %7d ",T[i]);
	printf("\n\n");

      if(n==0 || n==1)
         printf("%d n'est pas premier et n'existe aucun nombre premier",n);

	/* Debut de traitement du tableau */

	/* Le nombres 1 n'est pas premier */
	T[0]=0;
	/* On efface les multiples de 2 et les autres nombres composés */    
      i = 2;
          while(i<=n)
          {
                 j = i*2;
                 while(j<=n)
                 {
                     T[j]=0;
                     j+=i;
                 };
                 i++;
                 while((i<=n)&&(T[i]==0))
                 i++; 
                 printf(" %7d ",T[i]);   
          }    
      
      getch();
      return 0;
}                                           

Pour ce lui qui a parlé d’initiallisation du tableau, je crois que je l’ai faite en voulant afficher la table avant qu’elle subisse en aucun traitement.
Merci

Tu affiche T[i] or c’est i qui est premier d’après ton algo, en plus tu saute le 2 parce que tu affiche en fin de boucle, je dirais que ce que tu affiche :smiley: c’est:
4
6
8
12
14

ce qui est OK puisque 3,5,7,11 13 sont premier et que tu n’affiche pas 2?

sinon, dis nous ausi ce que ça affiche.

C’est pas un peu bourrin le crible ? :paf:

M’enfin sinon pourquoi stocker les nombres dans le tableau ?
L’index du tableau suffit, tu n’as qu’à stocker si le nombre est premier ou non, et dans ce cas tu peux faire un tableau de (unsigned char) voire de (char), du coup tu diminue de beaucoup la consommation mémoire.
Par exemple, pour 11, c’est t[11]=1, c’est plus simple.

Re
Oui tout à fait ça affiche : 4 6 8 12 14 18 20… or c’est pas ce qui est voulu c’est l’inverse qui faut : 2 3 5 7 11…
que dois je changer ?
Merci

ça
for(i=0; i<n; i++)
T[i]=i +1;

ou ça:
printf(" %7d ",T[ i ] );
:slight_smile:

Re
ça donne des nombres impaires et non pas premiers…
en tout cas merci
Je vais me mettre à ça serieusement, ça l’air d’un mauvais code mal traduit dès le début…
a+

n’abandonne pas trop vite, la prog, c’est de la persévérance :slight_smile: :

si tu enlève 1 à tous ces nombres, ils sont bien premier, ça devrais te donner une piste pour trouver :wink:

Ok merci…
a+