0007.c 990 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdint.h>
  4. #include <stdbool.h>
  5. struct primes_da {
  6. uint64_t *data;
  7. uint64_t size;
  8. uint64_t cap;
  9. };
  10. bool isprime(uint64_t n);
  11. void primes_fill(struct primes_da *primes);
  12. int
  13. main(int argc, const char **argv)
  14. {
  15. uint64_t res = 0;
  16. uint64_t target = 10001;
  17. struct primes_da primes = {0};
  18. primes.cap = target + 1;
  19. primes.data = calloc(primes.cap, sizeof(uint64_t));
  20. primes.size = 0;
  21. primes_fill(&primes);
  22. res = primes.data[target-1];
  23. printf("Result = %ld!\n", res);
  24. free(primes.data);
  25. (void) argc; (void) argv;
  26. return 0;
  27. }
  28. bool
  29. isprime(uint64_t n)
  30. {
  31. uint64_t i = 0;
  32. if ( (n & 1) == 0 ) {
  33. return ( n == 2 );
  34. }
  35. for ( i = 2; i < n; ++i ) {
  36. if ( (n % i) == 0 ) {
  37. return false;
  38. }
  39. }
  40. return true;
  41. }
  42. void
  43. primes_fill(struct primes_da *primes)
  44. {
  45. uint64_t i = primes->size;
  46. if ( i == 0 ) {
  47. i = 2;
  48. }
  49. for ( ; primes->size < primes->cap; ++i ) {
  50. if ( isprime(i) ) {
  51. primes->data[primes->size++] = i;
  52. }
  53. }
  54. }