トップページに戻る
次の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より大きい数は調べても無駄であるからです。