Crible d'erastophène
benjamim
Messages postés
1642
Date d'inscription
Statut
Membre
Dernière intervention
-
benjamim Messages postés 1642 Date d'inscription Statut Membre Dernière intervention -
benjamim Messages postés 1642 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
j'essai de faire le crible d'erasophène mais rien n'y fait. Je bloque.
J'ai tenté de 2 manières (voir la partie mise en commentaire) mais ça ne marche pas. Si vous pouviez me dire là où est mon erreur.
Merci :)
j'essai de faire le crible d'erasophène mais rien n'y fait. Je bloque.
J'ai tenté de 2 manières (voir la partie mise en commentaire) mais ça ne marche pas. Si vous pouviez me dire là où est mon erreur.
Merci :)
package Exo4p8;
import java.util.Scanner;
public class exo4p8 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int n, i, j, N;
Scanner sc = new Scanner(System.in);
System.out.print("Tapez l'entier");
N = sc.nextInt();
int[] Tab = new int [N];
for (i=0;i<N;i++)
{
Tab[i]=i+1;
}
Tab[0]=0;
i=1;
while(Tab[i]<=N)
{
for(j=2; j<Tab[i]; j++)
{
if(Tab[i]%j==0)
{
Tab[i]=0;
}
Tab[i]=Tab[i+1];
}
}
/*
for(i=2;i<N;i++)
{
if(Tab[i]%2 == 0)
{
Tab[i] = 0;
}
}
for(j=3;j<N;j++)
{
for(i=3;i<N;i++)
{
if(Tab[j] != 0)
{
if(Tab[i]%j == 0)
{
Tab[i] = 0;
}
}
}
}
*/
for(i=0;i<N;i++)
{
if(Tab[i] != 0)
{
System.out.print(Tab[i]+"est premier.");
}
}
}
}
4 réponses
-
Bonsoir,
Dans tes deux codes tu asif(Tab[i]%j==0)
or cela ne correspond pas du tout au crible d'Ératosthène qui cherche les multiples, pas les diviseurs !
Tu devrais regarder cet article, pour comprendre comment fonctionne l'algorithme avant de commencer à le coder :
http://fr.wikipedia.org/wiki/Crible_d'Ératosthène -
Justement, je m'inspire de cet article depuis le début mais je ne parviens pas à saisir l'idée.. :/
Pour moi, le 2éme code devrait marcher mais il m'affiche 2/3/5/7/9/11/...etc
Benjamim -
La crible d'Ératosthène se base sur un principe d'élimination, ce qui correspond aux nombres barrés sur l'image animée.
Dans ton code où apparaissent les nombres que tu as explorés ou non ?
De plus je m'interroge quant au type de ton tableau, le but étant d'indiquer si un nombre est premier, il n'y a que deux possibilités : vrai ou faux. Alors pourquoi avoir utilisé un tableau d'entiers, là où clairement on devrait avoir des booléens ?
Voici un bon début et une bonne fin pour ton code, je te laisse voir le milieu...
int n = sc.nextInt(); boolean[] prime = new boolean[n]; boolean[] explore = new boolean[n]; // ... for (int i=0; i<n; i++) if (prime[i]) System.out.println(i+" est premier"); -
En fait, j'avais une consigne où je devais faire un tableau d'entier ^^
Les nombres explorés non premiers deviennent 0, les autres restent tel qu'elle.
C'est pour ça que je bloque ahah (mais c'est le même principe, le faux correspond à mon zéro).