问题链接:https://pintia.cn/problem-sets/2474/problems/33389
问题描述
习题4-6 水仙花数 (20 分)
水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=13+53+33。 本题要求编写程序,计算所有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 <stdio.h>
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时,该算法也能在半分钟之内跑出所有结果