import java.io.*;

class OOPrimzahlen {
  public static void main(String argv[]){
    SiebEratosthenes sieb = new SiebEratosthenes();
    sieb.siebePrimzahlen(100000);
  }
}

class IntMenge {

  IntMenge (int n){
    größe = n;
    index = 2;
    elemente = new Element[n+1];
    for (int j = 0; j <= größe; j++){
      elemente[j] = new Element(j);
    }
    elemente[0].gelöscht = true;
    elemente[1].gelöscht = true;
  }

  public int holeKleinstesNichtMarkiertesElement(){
    for (int j = index; j <= größe; j++){
      if (!(elemente[j].gelöscht || elemente[j].markiert )){
	index = j;
	return j;
      }
    }
    return größe + 1; // besser: throw KeinNichtMarkiertesElement
  }

  public void markiereElement(int i){
    elemente[i].markiert = true;
  }

  public void löscheVielfache(int i){
    int vielfaches = i + i;
    while (vielfaches <= größe){
      elemente[vielfaches].gelöscht = true;
      vielfaches += i;
    }
  }

  public void ausgeben(){
    for (int j = 0; j <= größe; j++){
      if ( !elemente[j].gelöscht ){
      System.out.print(elemente[j].wert + " ");
      }
    }
  }

  private int größe;
  private int index;  // momentane untere Schranke 
  private Element[] elemente;

  private class Element{
    int wert;
    boolean markiert = false;
    boolean gelöscht = false;
    Element (int wert){this.wert = wert;}
  }
}

class SiebEratosthenes{

  void siebePrimzahlen(int n){
    IntMenge primZahlen1BisN = new IntMenge(n); 
    // enthält anfangs alle Zahlen von 1 bis n,
    // am Ende nur noch die Primzahlen

    int k = (int)Math.sqrt(n);
    int i = primZahlen1BisN.holeKleinstesNichtMarkiertesElement();
      while ( i<=k ){
	i = primZahlen1BisN.holeKleinstesNichtMarkiertesElement();
	primZahlen1BisN.markiereElement(i);
	primZahlen1BisN.löscheVielfache(i);
      }
    primZahlen1BisN.ausgeben();
  }
}




