|
@@ -1,17 +1,17 @@
|
|
|
#include <stdio.h>
|
|
|
#include <stdlib.h>
|
|
|
|
|
|
-char* data = NULL;
|
|
|
+static char* data = NULL;
|
|
|
|
|
|
-int hasBit(int index) {
|
|
|
+static int hasBit(size_t index) {
|
|
|
return (data[index >> 3] & (1 << (index & 7))) == 0;
|
|
|
}
|
|
|
|
|
|
-void setBit(int index) {
|
|
|
- data[index >> 3] |= (1 << (index & 7));
|
|
|
+static void setBit(size_t index) {
|
|
|
+ data[index >> 3] |= (char)(1 << (index & 7));
|
|
|
}
|
|
|
|
|
|
-int divideRound8(int i) {
|
|
|
+static size_t divideRound8(size_t i) {
|
|
|
return (i >> 3) + ((i & 7) != 0);
|
|
|
}
|
|
|
|
|
@@ -24,27 +24,33 @@ int main(int argAmount, const char** args) {
|
|
|
}
|
|
|
return 0;
|
|
|
}
|
|
|
- int max = atoi(args[1]);
|
|
|
- if(max <= 0) {
|
|
|
+ char* endP = NULL;
|
|
|
+ long maxRaw = strtol(args[1], &endP, 10);
|
|
|
+ if(maxRaw <= 0 || *args[1] == '\0' || *endP != '\0') {
|
|
|
puts("max prime should be a positive number");
|
|
|
return 0;
|
|
|
}
|
|
|
+ size_t max = (size_t)maxRaw;
|
|
|
|
|
|
- int end = (max - 1) >> 1;
|
|
|
+ size_t end = (max - 1) >> 1;
|
|
|
data = calloc(divideRound8(end), 1);
|
|
|
+ if(data == NULL) {
|
|
|
+ puts("failed allocation");
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
|
|
|
int found = 0;
|
|
|
if(max >= 2) {
|
|
|
puts("2");
|
|
|
found++;
|
|
|
}
|
|
|
- for(int i = 0; i < end; i++) {
|
|
|
+ for(size_t i = 0; i < end; i++) {
|
|
|
if(hasBit(i)) {
|
|
|
- long prime = (i << 1) + 3;
|
|
|
- for(long k = i + prime; k < end; k += prime) {
|
|
|
+ size_t prime = (i << 1) + 3;
|
|
|
+ for(size_t k = i + prime; k < end; k += prime) {
|
|
|
setBit(k);
|
|
|
}
|
|
|
- printf("%ld\n", prime);
|
|
|
+ printf("%zu\n", prime);
|
|
|
found++;
|
|
|
}
|
|
|
}
|
|
@@ -52,4 +58,4 @@ int main(int argAmount, const char** args) {
|
|
|
|
|
|
free(data);
|
|
|
return 0;
|
|
|
-}
|
|
|
+}
|