```/* \$Id: Sieve.c \$ */

/* Sieve of Eratosthenes algorithm
* Ref: http://www.math.utah.edu/~alfeld/Eratosthenes.html
* This implementation by David Ireland <www.di-mgt.com.au>
* \$Date: 2012/12/14 11:02Z \$
* \$Author: dai \$
*/

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

/* Usage: Sieve n
* where n = largest integer to test for prime
* (default = 1000)
*/

/* For first 10,000 primes use
Sieve 104729
because 104729 is the 10,000th prime
Ref: http://www.utm.edu/research/primes
*/

main(int argc, char *argv[])
{
int i, m, k;
int klimit, nlimit;
int *mark;

if (argc > 1)
nlimit = atoi(argv[1]);
else
nlimit = 1000;

mark = calloc(nlimit, sizeof(int));

/* Calculate limit for k */
klimit = (int)sqrt((double)nlimit) + 1;

/* Mark the composites */
/* Special case */
mark[1] = -1;

/* Set k=1. Loop until k >= sqrt(n) */
for (k = 1; k <= klimit; k = m)
{
/* Find first non-composite in list > k */
for (m = k + 1; m < nlimit; m++)
if (!mark[m])
break;

/* Mark the numbers 2m, 3m, 4m, ... */
for (i = m * 2; i < nlimit; i += m)
mark[i] = -1;
}

/* Now display results - all unmarked numbers are prime */
for (k = 0, i = 1; i < nlimit; i++)
{
if (!mark[i])
{
if (k % 10 == 0)
printf("%d: ", k);
printf("%d ", i);
k++;
if (k % 10 == 0 && k > 0)
printf("\n");
}
}
printf("\n");

free(mark);

return 0;
}
```