您的位置:首页 > 编程语言 > C语言/C++

c++ 使用深度优先搜索算法计算N位水仙数

2017-01-12 00:00 246 查看
一个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@ubuntu:~/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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  深度优先 c++ 水仙数