#include #include #include #include #define DIGITS (6) #define BASE_TEN (100000) uint32_t* get_digits(uint32_t n) { uint32_t* r = malloc(sizeof(uint32_t) * DIGITS); uint32_t base = BASE_TEN; for (size_t i = 0; i < DIGITS; i++) { r[i] = n / base; n = n % base; base /= 10; } return r; } uint32_t* get_power_four_lookup() { uint32_t* r = malloc(sizeof(uint32_t) * 10); r[0] = 0; r[1] = 1; r[2] = 2 * 2 * 2 * 2; r[3] = 3 * 3 * 3 * 3; r[4] = 4 * 4 * 4 * 4; r[5] = 5 * 5 * 5 * 5; r[6] = 6 * 6 * 6 * 6; r[7] = 7 * 7 * 7 * 7; r[8] = 8 * 8 * 8 * 8; r[9] = 9 * 9 * 9 * 9; return r; } uint32_t* get_power_five_lookup() { uint32_t* r = malloc(sizeof(uint32_t) * 10); r[0] = 0; r[1] = 1; r[2] = 2 * 2 * 2 * 2 * 2; r[3] = 3 * 3 * 3 * 3 * 3; r[4] = 4 * 4 * 4 * 4 * 4; r[5] = 5 * 5 * 5 * 5 * 5; r[6] = 6 * 6 * 6 * 6 * 6; r[7] = 7 * 7 * 7 * 7 * 7; r[8] = 8 * 8 * 8 * 8 * 8; r[9] = 9 * 9 * 9 * 9 * 9; return r; } bool is_representable(uint32_t number, uint32_t* lookup) { uint32_t* digits = get_digits(number); uint32_t digit_sum = 0; for (size_t i = 0; i < DIGITS; i++) digit_sum += lookup[digits[i]]; free(digits); if (number == digit_sum) return true; return false; } void print_digits(uint32_t* digits) { for (size_t i = 0; i < DIGITS; i++) { printf("%u", digits[i]); } } int main(int argn, char** argv) { uint32_t* lookup = get_power_five_lookup(); uint32_t sum = 0; for (uint32_t n = 10; n < 300000; n++) if (is_representable(n, lookup)) { printf("%u\n", n); sum += n; } printf("Sum: %d\n", sum); free(lookup); return 0; }