12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- #include <stdio.h>
- #include <stdlib.h>
- static char* data = NULL;
- static int hasBit(size_t index) {
- return (data[index >> 3] & (1 << (index & 7))) == 0;
- }
- static void setBit(size_t index) {
- data[index >> 3] |= (char)(1 << (index & 7));
- }
- static size_t divideRound8(size_t i) {
- return (i >> 3) + ((i & 7) != 0);
- }
- int main(int argAmount, const char** args) {
- if(argAmount < 2) {
- if(argAmount > 0) {
- printf("%s <max_prime>\n", args[0]);
- } else {
- puts("... <max_prime>");
- }
- return 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;
- 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(size_t i = 0; i < end; i++) {
- if(hasBit(i)) {
- size_t prime = (i << 1) + 3;
- for(size_t k = i + prime; k < end; k += prime) {
- setBit(k);
- }
- printf("%zu\n", prime);
- found++;
- }
- }
- printf("found: %d\n", found);
- free(data);
- return 0;
- }
|