I have created a program to find prime numbers up to the 32nd power of 2. It uses the sieve of Eratosthenes. I would appreciate it if you could let me know any bugs or improvements I can make.
/*
* prime32.c
*/
#include <stdio.h>
char isprime1[0x10000];
char isprime2[0x10000];
typedef unsigned int UINT;
void solve1() {
int i, j;
for (i = 0; i < 0x10000; ++i) {
isprime1[i] = 1;
}
isprime1[0] = 0;
for (i = 2; i <= 0x10000; ++i) {
if (!isprime1[i-1]) continue;
for (j = 2 * i - 1; j < 0x10000; j += i) {
isprime1[j] = 0;
}
}
}
void solve2(UINT start) {
long long int i, j, offset;
for (i = 0xFFFF; i >= 0; --i)
isprime2[i] = 1;
for (i = 1; i <= 0x10000; ++i) {
if (!isprime1[i-1]) continue;
offset = (start + 0xFFFF) % i;
for (j = 0xFFFF - offset; j >= 0; j -= i) {
isprime2[j] = 0;
}
}
}
void print1(FILE *fp) {
int i;
for (i = 0; i < 0x10000; ++i) {
if (!isprime1[i]) continue;
fprintf(fp, "%d\n", i + 1);
}
}
void print2(FILE *fp, UINT start) {
long long int i;
for (i = 0; i < 0x10000; ++i) {
if (!isprime2[i]) continue;
fprintf(fp, "%lld\n", start + i);
}
}
int main() {
FILE *fp;
UINT i;
solve1();
fp = fopen("prime32.out", "w");
print1(fp);
for (i = 0x10001; i != 1; i += 0x10000) {
solve2(i);
print2(fp, i);
}
fclose(fp);
return 0;
}