|
@@ -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;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|