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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值