题目:Digit fifth powers
Surprisingly there are only three numbers that can be written as the sum of fourth powers of their digits:
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
As 1 = 14 is not a sum it is not included.
The sum of these numbers is 1634 + 8208 + 9474 = 19316.
Find the sum of all the numbers that can be written as the sum of fifth powers of their digits.
这个问题是求PDI数,即perfect digital invariant,是对求水仙花数的泛化。
数学描述
假设数N = a1a2...an,其中a1 > 0。求满足以下条件的数N:
左边表达式值的范围为:
右边表达式值的范围为:
可得不等式:
则搜索范围缩小为
代码实现
//http://projecteuler.net/problem=30
//Digit fifth powers
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
//perfect digital invariant
//A PDI is a number equal to the sum of a power of its digits
//when the power is not equal to the length of the number
bool IsPDI(unsigned int digit, unsigned int p)
{
unsigned int n = digit, power_sum = 0;
do
{
power_sum += (unsigned int)pow(double(n%10), (int)p);
n /= 10;
} while (n != 0);
return power_sum == digit;
}
void GetPDI(vector<unsigned int> &vec, unsigned int p)
{
unsigned int limit = (unsigned int)pow((double)9, (int)p) * (p + 1);
for (unsigned int i = 2; i < limit; ++i)
{
if (IsPDI(i, p))
{
vec.push_back(i);
}
}
return;
}
int _tmain(int argc, _TCHAR* argv[])
{
vector<unsigned int> vec;
GetPDI(vec, 5);
unsigned int sum = 0;
for (vector<unsigned int>::size_type i = 0; i != vec.size(); ++i)
{
cout<<"["<<i<<"\t] = "<<vec[i]<<endl;
sum += vec[i];
}
cout<<"sum = "<<sum<<endl;
system("pause");
return 0;
}
输入:p=5
输出:
更多参考:
http://web.archive.org/web/20091027123639/http://www.geocities.com//~harveyh/narciss.htm