#include <stdlib.h>
#include <stdio.h>
#include <inttypes.h>
#include <stdbool.h>

#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;
}
    
