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;
}
水仙是指一个 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++ 用递归函数计算n的阶乘n!
- C/C++面试之算法系列--快速计算32位数中1的位数
- c/c++_计算总运费_switch语句的使用
- 【转】C/C++中 算法运行时间的三种计算方式
- 【算法导论】22.3 图的深度优先搜索-C++实现
- C# 中使用 MD5 算法计算 hash (哈希)值的四种方法
- c++ 泛型算法 使用方法总结
- 算法 - 有两个相同大小数组均已按升序排列好,编程计算这两个数组的中位数(C++)
- MySQL性能调优 – 使用更为快速的算法进行距离计算
- C++开源矩阵计算工具——Eigen 在VS2005中的下载、配置与使用
- C/C++面试之算法系列--借刀杀人,不使用任何中间变量实现strlen
- C# 中使用 MD5 算法计算 hash (哈希)值的四种方法
- C++ STL 算法另类使用方法
- 用c++高精度的计算π的值,可精确到n位
- PinBlock 算法 使用ANSI x9.8计算
- C# 中使用 MD5 算法计算 hash (哈希)值的四种方法
- C++ 之高效使用STL(移除算法的选择)
- C/C++中算法运行时间的三种计算方式
- c++ stl 算法使用
- Windows环境是使用C语言计算程序或算法执行时间的不同粒度实现