Main.c 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. static char* data = NULL;
  4. static int hasBit(size_t index) {
  5. return (data[index >> 3] & (1 << (index & 7))) == 0;
  6. }
  7. static void setBit(size_t index) {
  8. data[index >> 3] |= (char)(1 << (index & 7));
  9. }
  10. static size_t divideRound8(size_t i) {
  11. return (i >> 3) + ((i & 7) != 0);
  12. }
  13. int main(int argAmount, const char** args) {
  14. if(argAmount < 2) {
  15. if(argAmount > 0) {
  16. printf("%s <max_prime>\n", args[0]);
  17. } else {
  18. puts("... <max_prime>");
  19. }
  20. return 0;
  21. }
  22. char* endP = NULL;
  23. long maxRaw = strtol(args[1], &endP, 10);
  24. if(maxRaw <= 0 || *args[1] == '\0' || *endP != '\0') {
  25. puts("max prime should be a positive number");
  26. return 0;
  27. }
  28. size_t max = (size_t)maxRaw;
  29. size_t end = (max - 1) >> 1;
  30. data = calloc(divideRound8(end), 1);
  31. if(data == NULL) {
  32. puts("failed allocation");
  33. return 0;
  34. }
  35. int found = 0;
  36. if(max >= 2) {
  37. puts("2");
  38. found++;
  39. }
  40. for(size_t i = 0; i < end; i++) {
  41. if(hasBit(i)) {
  42. size_t prime = (i << 1) + 3;
  43. for(size_t k = i + prime; k < end; k += prime) {
  44. setBit(k);
  45. }
  46. printf("%zu\n", prime);
  47. found++;
  48. }
  49. }
  50. printf("found: %d\n", found);
  51. free(data);
  52. return 0;
  53. }