blob: 185b0311e4507ed5b66ab3a9b54b2dcb3f48295e (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
/* sieve using pointers */
#define TRUE 1
#define FALSE 0
#define NITER 100
#define SIZE 8191 /* last prime <= 2*this+3 */
#define SQRSIZE 63 /* last divisor tested = 2*this+3 */
char flags[SIZE+2*SQRSIZE+3]; /* avoid ptr+=prime overflowing */
main()
{
int i,count,iter;
register char *ptr;
char *endptr;
int prime;
for (iter=0;iter<NITER;iter++)
{
count=0;
ptr=flags;
endptr=flags+SIZE;
while (ptr<endptr)
*ptr++=TRUE;
for (i=0;i<SQRSIZE;i++)
{
if (flags[i])
{
prime=i+i+3;
ptr=flags+i+prime; /* ptr<endptr since i<SQRSIZE */
while (ptr<endptr)
{
*ptr=FALSE;
ptr+=prime; /* does not overflow since in flags */
}
count++;
}
}
ptr=flags+SQRSIZE;
while (ptr<endptr)
if (*ptr++)
count++;
}
printf( "%d primes\n", count );
}
|