一个N位数,其各个数位上的数的n次方之和恰好等于原数,这样的数叫做“自幂数”。Narcissus number,又称“纳西塞斯”数
水仙是指一个 3位数 ( n=3 ),它的每个位上的数字的3次幂之和等于它本身。(例如:1^3 + 5^3 + 3^3 = 153)
一位数 均为独身数
二位数中无自幂数
三位的水仙数共有4个:153,370,371,407;
四位的玫瑰花数共有3个:1634,8208,9474;
五位的五角星数共有3个:54748,92727,93084;
六位的六合数只有1个:548834;
七位的北斗七星数共有4个:1741725,4210818,9800817,9926315;
八位的八仙数共有3个:24678050,24678051,88593477
补充: 继续查找9位数以上的水仙数:
9位的九九重阳数:146511208 ,472335975 ,534494836, 912985153
10位的十全十美数:没有
(注意)每位上的数字是可以重复的。
#############################################################
yuanzhen:~/C_script$ cat dfs_four.cpp
#include <iostream> #include <vector> #include <cmath>using std::pow;
using std::cout; using std::endl; using std::vector;int n;
vector<int> vec;
//vector<int> book(10,0); 若计算每位数字不重复的水仙数是会用到
int get_left(vector<int> avec)
{ int left=0; for(int i=0;i<n;++i) { left=left+avec[i]*pow(10,i); } return left; }int get_right(vector<int> avec)
{ int right=0; for(int i=0;i<n;++i) { right=right+pow(avec[i],n); } return right; }void show(vector<int> avec)
{ vector<int>::const_iterator cit; for(cit=avec.begin();cit!=avec.end();++cit) { cout << *cit << "\t"; } cout << endl; }vector<int> init(int n)
{ vector<int> avec(n,0); return avec; }void dfs(int step)
{ if(step==n) { int left=get_left(vec); int right=get_right(vec);if(left==right && left >= pow(10,n-1))
{ cout << left << "\t" ; return ; } } for(int i=0;i<=9;++i) { if(step < n) //计算每位数字不重复时,条件改为 if(step < n && book[i]==0); 此处之所以需要小于n,是因为要计算的水仙数是n位 即为 vec[0] vec[1] ........vec[n-1]; { vec[step]=i;//book[i]=1; //计算每位数字不重复时去掉注释
dfs(step+1);//book[i]=0; //计算每位数字不重复时去掉注释
vec[step]=0; } } }int main(int argc, char** argv)
{ std::cin >> n; vec=init(n); //show(vec); dfs(0); cout << endl; return 0; }