#include <stdio.h>
#include <stdlib.h>

#define MAX 10000

/* Secuencia dentro de la secuencia del principal 
   Elementos de la secuencia (j): múltiplos de v[pos], ó pos+2, en v
   Primer elemento j=2 ; primer múltiplo de pos en: pos * j
   Ultimo elemento de la secuencia: j = final/pos
   Elemento siguiente: j := j + 1
   Tratamiento en curso = tratamiento final: anula el múltiplo de pos: v[j*pos-2] := 0;
   Esquema 2 y conozco el número de iteraciones (final/pos) -1 
   ==> esquema para, y el obtener elemento siguiente lo gestiona el propio esquema
*/ 

void elimina_multiplos (int pos, short int *v, int final)
{
  int j;
  for (j=2; j <= final/pos; j++) { 
    printf("\n\tElimino la posicion %d que almacena el numero %d", pos*j-2, v[pos*j-2]);
	v[pos*j-2]= 0;
  }
  /* j*pos > final --> no puedo acceder a esa posición*/
}

/* Secuencia principal: 2 <= i <= N
   Obtener elemento siguiente = i:=i+1
   Elemento final: i = N
   Tratamiento curso = Tratamiento final: Esquema 2:
               si v[i] <> 0 es primo y eliminar múltiplos de i del vector
   Numero de iteraciones conocido: N-2 --> Esquema Para 
*/

void criba_eratostenes (int N)
{
  short int v[MAX];
  int i;
  /* Inicicializo tratamiento */
  for (i=0; i < N-1; i++) v[i] = i+2;
 
  for (i=0; i < N-1; i++) 
    if (v[i] != 0) {
	  printf("\n%d es primo", v[i]); /* v[i] almacena i+2*/
	  elimina_multiplos (i+2, v, N);
  }
}


/* Programa principal
  Secuencia: Valores válidos de cuantos, hasta que cuantos < 0
  Tratamiento curso = generar numeros primos entre 2 y cuantos mediante
  la criba de Eratóstenes
  Tratamiento final = vacío
  Tratamiento en curso <> Tratamiento final => esquema mientras
  Numero de iteraciones desconocido => esquema 1
*/
int main(){
int cuantos;

  printf("\nDame un numero valido (entre 2 y 10000). Negativo y termino");
  scanf("%d", &cuantos);
  while (cuantos > 1 && cuantos <= 10000) {
    criba_eratostenes(cuantos);
    printf("\nDame un numero valido (entre 2 y 10000). Negativo y termino");
    scanf("%d", &cuantos);
  }
}
