問題30

驚くべきことに, 各桁の数字を4乗して合計すると元の数字になる数字は次の3つだけである.
 \begin{eqnarray} 1634 &=& 1^4 + 6^4 + 3^4 + 4^4 \\ 8208 &=& 8^4 + 2^4 + 0^4 + 8^4 \\ 9474 &=& 9^4 + 4^4 + 7^4 + 4^4 \end{eqnarray}
ただし,  1 = 1^4 は含まない.
それらの数の合計は, 1634 + 8208 + 9474 = 19316.

では, 各桁の数字を5乗して合計すると元の数字になる数字の合計を求めよ.

http://projecteuler.net/index.php?section=problems&id=30

小さい方から探索していけば良いのですが, 上限を決めなければいけません. そこで数学の登場です!

n 桁の数字の各桁の4乗の合計は, 高々  n*9^5 = 59049n. よって, 7桁以上の数になると絶対に問題の条件を満たさない. てなわけでコーディング.

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

const int RADIX = 10;
const int UPPER_BOUND = 1000000;

int sumOfFifthPowers(int);

int main() {
	int number;
	int result;

	for (number = 2, result = 0; number < UPPER_BOUND; number++) {
		if (number == sumOfFifthPowers(number)) {
			fprintf(stdout, "%d\n", number);
			result += number;
		}
	}
	fprintf(stdout, "Solution: %d.\n", result);

	return EXIT_SUCCESS;
}

int sumOfFifthPowers(int number) {
	int digit;
	int sum;

	sum = 0;
	while (number) {
		digit = number % RADIX;
		number /= RADIX;
		sum += pow(digit, 5);
	}

	return sum;
}