博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c++ 使用深度优先搜索算法计算N位水仙数
阅读量:7107 次
发布时间:2019-06-28

本文共 1747 字,大约阅读时间需要 5 分钟。

hot3.png

一个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;
}
 

转载于:https://my.oschina.net/lCQ3FC3/blog/823774

你可能感兴趣的文章
I.MX6 Linux U-boot 环境变量解析
查看>>
rtems源码补丁贡献要求(官网解析)
查看>>
Linux如何从零开始搭建nfs服务器(centOS6)
查看>>
固定宽度布局的列背景色设置
查看>>
dragsort html拖拽排序
查看>>
System.out.println(request.getContextPath());
查看>>
非常正经的看毛片(?)
查看>>
CF 514C(hash)
查看>>
工程代码の初體驗
查看>>
JS节点操作 (表格在js中添加行和单元格,并有一个删除键)
查看>>
poj 1338
查看>>
关于c++中map的内存占用问题
查看>>
SoftEng-logo队成立了!
查看>>
REPLACE...IN.....WITH.... 的使用
查看>>
static变量和static函数
查看>>
linux gcc编译protocol
查看>>
让linux启动后自动进入图形界面或文本界面
查看>>
C# Thread类的应用
查看>>
如何成为资深的python专家
查看>>
在26个大小写字母(52个),以及9个数字组成的字符列表中,随机生成10个8位密码...
查看>>