DFS实现水仙花数的查找

问题链接:https://pintia.cn/problem-sets/2474/problems/33389

问题描述

习题4-6 水仙花数 (20 分)

水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=1​3​​+5​3​​+3​3​​。 本题要求编写程序,计算所有N位水仙花数。

输入格式:

输入在一行中给出一个正整数N(3≤N≤7)。

输出格式:

按递增顺序输出所有N位水仙花数,每个数字占一行。

输入样例:

3

输出样例:

153
370
371
407

题目分析: 这道题如果N是3,那么有多种做法,你可以枚举100-999内的数,依次拆分及判断,这样的复杂度为O(10^(n+1)),显然这是最简单粗暴的做法,那么另一种比较可观的做法就是枚举每一位数,可以用N个嵌套循环,可是这里N未知,所以可以用DFS来实现查找,复杂度为O(10^n),对这道题来说是可以接受的;

代码实现

#include 

int n;

int qck(int a, int b)//快速幂优化幂运算 
{
	int res = 1;
	while(b >= 1)
	{
		if(b & 1)
			res *= a;
		a *= a;
		b >>= 1;
	}
	return res;
}
void DFS(int cur, int x, int t)/*cur是当前位数,x是当前的数,t是当前位数的立方和*/ 
{
	if(cur == n)
	{
		if(x == t) //相等输出 
			printf("%d\n", x);
		return;
	}
	int s = 0;
	if(cur == 0)//没有前导0 
		s = 1;
	for(int i = s; i < 10; i++)
	{
		t += qck(i, n);
		DFS(cur+1, x*10+i, t);//DFS递归搜索 
		t -= qck(i, n);//回溯 
	}		
}
int main()
{
	scanf("%d", &n);
	DFS(0, 0, 0);
}

通过本人测试,运行时间还是比较可观的。 

测试点 提示 结果 耗时 内存
0 sample等价, 4 答案正确 1 ms 384 KB
1 6, 只有1个 答案正确 11 ms 280 KB
2 N==5 答案正确 3 ms 296 KB
3 最大N,输出4个 答案正确 93 ms 488 KB

 

当N=9时,该算法也能在半分钟之内跑出所有结果

DFS实现水仙花数的查找_第1张图片

你可能感兴趣的:(DFS,PAT)