Вот как-то так
Код:
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
static int Rest[8] = { 1, 7, 11, 13, 17, 19, 23, 29 };
static unsigned char *A;
static int V; // Объем массива A
#define N 12000 // До какого числа строить решето
main()
{ int s, p, ii, jj;
V = N/30 + 1;
A = (unsigned char *)malloc(V);
A[0] = 1;
memset(A+1, 0, V-1);
s = sqrt(N);
for(ii=p=0; p<=s; ii++) {
for(jj=0; jj<8; jj++) {
if (A[ii] &(1<<jj)) continue;
p = 30*ii + Rest[jj]; // Простое
Jolting(p);
}
}
for(ii=0; ii<V; ii++) {
for(jj=0; jj<8; jj++) {
if (A[ii] & (1<<jj)) continue;
printf ("%d\n", 30*ii + Rest[jj]);
}
}
}
/****************/
Jolting(int p)
{ int x, d, r, i;
for(x=7*p; ; x += 2*p) {
d = x/30;
if (d >= V) break;
r = x%30;
for(i=0; i<8; i++) if (r==Rest[i]) break;
if (i==8) continue;
A[d] |= (1<<i);
}
}
/****************/
Несколько первых простых пропущено, их можно добавить вручную Или немного модифицировать алгоритм.
Функцию Jolting можно слегка оптимизировать, чего я делать не стал, тк. нас в первую очередь интересует объем памяти.
Так же не стал заморачиваться на проблемах больших чисел и длинной арифметики.
Удачи!