Project Euler 题解 #30 Digit fifth powers

来源:互联网 发布:spss 23 mac 许可证 编辑:程序博客网 时间:2024/06/03 18:29

题目:Digit fifth powers

Surprisingly there are only three numbers that can be written as the sum of fourth powers of their digits:

1634 = 14 + 64 + 34 + 44
8208 = 84 + 24 + 04 + 84
9474 = 94 + 44 + 74 + 44

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 numberbool 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

http://zh.wikipedia.org/wiki/Category:%E6%95%B8%E5%AD%97%E7%9B%B8%E9%97%9C%E7%9A%84%E6%95%B8%E5%88%97

原创粉丝点击