#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 1000000
#define TABSIZE 100000
static int primeS[N];
int maketable(void) {
int n, i, r, q, idx;
primeS[0] = 2;
primeS[1] = 3;
idx = 2;
for (n = 4; n < N; n++) {
i = 0;
do {
r = n % primeS[i];
if (r == 0)
break;
q = n / primeS[i];
i++;
} while (primeS[i] < q);
if (r > 0) {
primeS[idx] = n;
idx++;
if (idx > TABSIZE) {
fprintf(stderr, "table size is too small, aborted. idx = %d\n", idx);
exit(-1);
}
}
}
return idx;
}
int foundp(int s, int n) {
int max, min, mid;
max = n - 1; min = 0;
while (max > min) {
mid = (max + min) / 2;
if (primeS[mid] == s)
return 1;
if (primeS[mid] < s)
min = mid + 1;
else
max = mid - 1;
}
if (primeS[min] == s)
return 1;
return 0;
}
int main() {
int n, s, p;
int i, j, k;
int max_i, max_j, max_k, max_s;
time_t stt, end;
stt = time(NULL);
n = maketable();
p = primeS[n - 1];
printf("n = %d(%d)\n", n, p);
max_i = max_j = max_k = max_s = 0;
for (i = 0; i < n; i++) {
s = 0;
for (k = 1, j = i; j >= 0; --j, k++) {
s += primeS[j];
if (s > p)
break;
if ((s % 2) && foundp(s, n)) {
if (k > max_k) {
max_i = i; max_j = j; max_k = k; max_s = s;
}
}
}
}
printf("max prime: %d, series: form %d to %d (%d)\n", max_s, primeS[max_j], primeS[max_i], max_k);
end = time(NULL);
printf("time: %d sec\n", end - stt);
return 0;
}
/* end */