Browse Source

feat(initial) Initial commit with code.

Sieve can work up to MAX (long long) as defined in the libc.
Douglas Andreani 4 years ago
parent
commit
626ad8dc3d
2 changed files with 66 additions and 0 deletions
  1. 7 0
      prime-sieve/Makefile
  2. 59 0
      prime-sieve/sieve.c

+ 7 - 0
prime-sieve/Makefile

@@ -0,0 +1,7 @@
+CFLAGS=-g -Wall -Wextra -Werror -D _DEFAULT_SOURCE -O0 -D_XOPEN_SOURCE=600 -pthread -pedantic -pedantic-errors -fno-fast-math -fno-builtin -m64 -std=iso9899:1999
+
+
+all: sieve
+
+sieve: sieve.c
+	$(CC) $(CFLAGS) $< -o $@

+ 59 - 0
prime-sieve/sieve.c

@@ -0,0 +1,59 @@
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <inttypes.h>
+
+
+#define NON_PRIME 1
+#define PRIME 2
+
+typedef struct value {
+    long long number;
+    uint8_t flag;
+} value;
+
+int main (int argc, char** argv) {
+    if (argc != 2) {
+        printf("usage: %s [upper limit]", argv[0]);
+        return -1;
+    }
+    
+    long long limit = atoll(argv[1]);
+    value *v;
+    v = malloc(sizeof(value) * limit);
+
+    // fill value
+    for (int i = 2;  i < limit - 2; ++i){
+        v[i].number = i;
+        v[i].flag = 0;
+    }
+
+
+    for (long long i = 2;  i < limit - 2; ++i){
+        if (v[i].flag == NON_PRIME) {
+            continue;
+        }
+        v[i].flag = PRIME;
+        long long z = i;
+        long long j = z * z;
+        while (j < limit) {
+            v[j].flag = NON_PRIME;
+            j = v[i].number * z;
+            z++;
+        }
+    }
+    long long count = 0;
+    for (long long i = 2;  i < limit - 2; ++i){
+         if (v[i].flag == PRIME) {
+             printf("\nPrime: %lld", v[i].number);
+             count ++;
+         }
+     }
+
+     printf("\n\nTotal Primes: %lld", count);
+
+     return 0;
+}
+
+
+