トップページに戻る    次のC++のサンプルへ    前のC++のサンプルへ

Problem30 各桁を5乗した和が元の数と一致する数の総和

問題

驚くべきことに, 各桁を4乗した和が元の数と一致する数は3つしかない.

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乗
ただし, 1=1の4乗は含まないものとする. この数たちの和は 1634 + 8208 + 9474 = 19316 である.

各桁を5乗した和が元の数と一致する数の総和を求めよ.


ソース

#include <math.h>
#include <stdio.h>
#include <Windows.h>
#include <string>

void main()
{
    int Jyougen;
    for (int I = 1; I <= 7; I++) {
        printf("%d桁での最大値 = 9の5乗*%d = %6d\n",I,I,(int)pow(9.0,5) * I);
        if (I == 6) Jyougen = (int)pow(9.0,5) * I;
    }
    puts("");

    //const int TargetJyousuu = 4;
    const int TargetJyousuu = 5;

    int AnswerSum = 0;
    for (int I = 2; I <= Jyougen; I++) {
        char WKArr[100]; wsprintf(WKArr,"%d",I);
        std::string WKStr(WKArr);

        int wkSum = 0;
        for (int J = 0;J<=(int)WKStr.size()-1;J++){
            double wkDouble = (double)atoi(WKStr.substr(J,1).c_str());
            wkSum += (int)pow(wkDouble,TargetJyousuu);
            if (wkSum > I) break;
        }
        if (wkSum == I) {
            printf("%6dが一致。ここまでの和は%6d\n" , wkSum , AnswerSum+=wkSum);
        }
    }
}


実行結果

1桁での最大値 = 9の5乗*1 =  59049
2桁での最大値 = 9の5乗*2 = 118098
3桁での最大値 = 9の5乗*3 = 177147
4桁での最大値 = 9の5乗*4 = 236196
5桁での最大値 = 9の5乗*5 = 295245
6桁での最大値 = 9の5乗*6 = 354294
7桁での最大値 = 9の5乗*7 = 413343

  4150が一致。ここまでの和は  4150
  4151が一致。ここまでの和は  8301
 54748が一致。ここまでの和は 63049
 92727が一致。ここまでの和は155776
 93084が一致。ここまでの和は248860
194979が一致。ここまでの和は443839


解説

最初に6桁での各桁を5乗した和の最大値を求めてから、力任せで調べてます。

1桁での最大値 = 9の5乗*1 =  59049
2桁での最大値 = 9の5乗*2 = 118098
3桁での最大値 = 9の5乗*3 = 177147
4桁での最大値 = 9の5乗*4 = 236196
5桁での最大値 = 9の5乗*5 = 295245
6桁での最大値 = 9の5乗*6 = 354294
7桁での最大値 = 9の5乗*7 = 413343
ですので、
7桁は、調べても無駄であり、
6桁も354294より大きい数は調べても無駄であるからです。