数学の力

京大生が数学の定理・公式の証明や入試問題の解説をするブログ.

プロジェクトオイラー30. ~ Digit fifth powers ~


スポンサードリンク

No.30 Digit fifth powers

問題.

驚いたことに, 自身の各桁の数字の 4 乗和として書ける数は 3 つしかない:\begin{align*}
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{align*}ここで,  1=1^4 は含めていない.これらの数の和は  1634+8208+9474=19316.

では, 自身の各桁の数字の 5 乗和で書ける数の和はいくつになるか.

ちなみに,特にn桁の自然数で各桁の数字のn乗和がその数自身に一致するものはナルシシストと呼ばれます.(→Wikipedia)

考え方とプログラム例.(c)

まず, 調べる範囲を狭めるために次のようなことを考えます.


 n 桁の自然数が, 各桁の 5 乗和で書けるとします.


 n 桁の数は, 最小で  10^{n-1}, 最大で  10^n-1.

 n 桁の数の各桁の数字の 5 乗和は, 最小で  n\cdot 1^5=n, 最大で  n\cdot 9^5 です.


すると,  n\geqq 7 のとき,  n\cdot 9^5<10^{n-1} となるため, 上の 2 つの数が一致することはありません.

よって, 6 桁以下の数について調べればよいことが分かります.

#include <stdio.h>

int fifth_power(int a);

int main(){
    int n, n_prime;
    int i;
    int sum_of_power;
    int sum = 0;
    int digit[6];

    for(n = 2; n <= 999999; n++){
        sum_of_power = 0;
        for(i = 0; i < 6; i++){
            digit[i] = 0;
        }
        n_prime = n;
        for(i = 0; i < 6; i++){
            digit[i] = n_prime % 10;
            n_prime /= 10;
            sum_of_power += fifth_power(digit[i]);
        }

        if(n == sum_of_power){
            printf("%d\n", n);
            sum += n;
        }
    }

    printf("sum = %d\n", sum);
}

int fifth_power(int a){
    return (a * a * a * a * a);
}