sieve.c 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. #include <stdio.h>
  2. #include <stdint.h>
  3. #include <stdlib.h>
  4. #include <inttypes.h>
  5. #define NON_PRIME 1
  6. #define PRIME 2
  7. typedef struct value {
  8. long long number;
  9. uint8_t flag;
  10. } value;
  11. int main (int argc, char** argv) {
  12. if (argc != 2) {
  13. printf("usage: %s [upper limit]", argv[0]);
  14. return -1;
  15. }
  16. long long limit = atoll(argv[1]);
  17. value *v;
  18. v = malloc(sizeof(value) * limit);
  19. // fill value
  20. for (int i = 2; i < limit - 2; ++i){
  21. v[i].number = i;
  22. v[i].flag = 0;
  23. }
  24. for (long long i = 2; i < limit - 2; ++i){
  25. if (v[i].flag == NON_PRIME) {
  26. continue;
  27. }
  28. v[i].flag = PRIME;
  29. long long z = i;
  30. long long j = z * z;
  31. while (j < limit) {
  32. v[j].flag = NON_PRIME;
  33. j = v[i].number * z;
  34. z++;
  35. }
  36. }
  37. long long count = 0;
  38. for (long long i = 2; i < limit - 2; ++i){
  39. if (v[i].flag == PRIME) {
  40. printf("\nPrime: %lld", v[i].number);
  41. count ++;
  42. }
  43. }
  44. printf("\n\nTotal Primes: %lld", count);
  45. return 0;
  46. }