Implemented Sieve of Eratosthenes in an array.
I refrained from using % (Modulus). I am unsure of how modulus works in C but I believed that it will hinder the performance when working with large numbers. Instead, I have used a for loop with changing steps.
One way of optimizing this would be to somehow delete the non-prime numbers from the array and don't even check the array.
However, since the state of a number is represented in respect to position number of the array, I can not think of a faster way to use the same array to solve the problem.
I have implemented a dirty linked list code in Problem 3a.
I say it's dirty because it works without declaring temporary pointers and does not fully traverse the list to delete a value.
Anyways, without further ado, here is the code I have used.
Feel free to leave a comment.
#include <stdio.h> #include <stdlib.h> int sieve[1000000]; int main(){ memset(sieve, -1, sizeof(int)*1000000); sieve[2] = 1; int i, j, div; for (i = 4; i <= 1000000; i+=2){ sieve[i] = 0; } i = 3, j = 3, div = 3; while (i <= 1000000){ if (sieve[i] == -1){ div = i; sieve[i] = 1; for (j = div*2; j<=1000000; j+=div) sieve[j] = 0; } i++; } int counter = 0; i = 2; while (counter != 10001){ if (sieve[i++] == 1) counter++; } printf("%d\n", --i); return 0; }
Best Execution Time: 0.055s
Answer:
No comments:
Post a Comment