Project Euler 题解 #30 Digit fifth powers

题目: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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值