uaveiro-leci/2ano/1semestre/aed/aula02/primes.c

32 lines
863 B
C

//
// Tomás Oliveira e Silva, AED, October 2021
//
// This program implements a simple sieve of Eratosthenes.
// It does not work as intended. Use the valgrind and
// gdb programs to find the programming errors. Correct them.
//
#include <stdio.h>
#include <stdlib.h>
int main(void) {
const int limit = 1000000;
int *sieve = (int *)malloc((size_t)limit);
if(sieve == NULL)
return 1;
for(int i = 0;i <= limit;i++)
sieve[i] = 0;
sieve[0] = sieve[1] = 1; // 0 and 1 are not prime
for(int p = 2;p * p <= limit;p++)
if(sieve[p] == 0)
for(int i = p * p;i <= limit;i += p)
sieve[i] = 1; // i is not prime
int c = 0;
for(int i = 0;i <= limit;i++)
if(sieve[i] == 0)
c++;
printf("There are %d prime numbers up to %d\n",c,limit);
free(sieve);
return 0;
}