Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdlib.h>
- #include <inttypes.h>
- #include <stdio.h>
- static int is_divisible_recursive(const uint64_t shared[], const size_t shareds,
- const uint64_t k, size_t i)
- {
- /* k need not reduced further */
- if (k < 100000)
- return 0;
- /* Tail recursion converted to a loop */
- for (; i < shareds; i++)
- if (!(k % shared[i]))
- if (is_divisible_recursive(shared, shareds, k / shared[i], i))
- return 1;
- /* no more relevant divisors */
- return k <= 150000;
- }
- static inline int is_divisible(const uint64_t n)
- {
- uint64_t shared[388]; /* Divisors shared by n and our candidate divisors */
- size_t shareds = 0;
- uint64_t d;
- /* Trivial tests first. */
- if (n < 100000)
- return 0;
- else
- if (n <= 150000)
- return 1;
- /* Find all divisors of n, 2 <= n <= sqrt(150000) = 387. */
- for (d = 2; d <= 387; d++)
- if (!(n % d))
- shared[shareds++] = d;
- /* Recursive search. */
- return is_divisible_recursive(shared, shareds, n, 0);
- }
- int main(void)
- {
- uint64_t n = 0;
- uint64_t i;
- for (i = 1; i <= 500000; i++)
- n += is_divisible(i);
- printf("%" PRIu64 "\n", n);
- return EXIT_SUCCESS;
- }
Add Comment
Please, Sign In to add comment