算法题目

水仙花数(Narcissistic number)也被称为超完全数字不变数(pluperfect digital invariant, PPDI)、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number),水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身。例如:1^3 + 5^3+ 3^3 = 153。

水仙花数只是自幂数的一种,严格来说3位数的3次幂数才称为水仙花数。

--- 引自百度百科

自幂数是指一个 n 位数,它的每个位上的数字的 n 次幂之和等于它本身

算法思路

参数:n : n位数,每个数字的n次幂

1,预先计算1~9 的 n次幂,放入map备用

2,预先计算 10 的 0~n 次幂,放入map备用

2,n位数最小值,最大值,遍历升次对比

3,将符合条件的放入列表

代码实现

/*** 求 自幂数* @param n 位数* @return* @throws Exception*/public static List<Integer> sxhGet(int n) throws Exception{// int的取值范围为:-2^31 ---- 2^31-1 ,即:-2147483648 - 2147483647if(n > 10){throw new Exception("no support");}// +1List<Integer> ret = new ArrayList<>();// +1HashMap<Integer,Integer> map = new HashMap<>();//10 的 0~n 次幂HashMap<Integer,Integer> powMap = new HashMap<>();for(int i=1;i<=n;i++){powMap.put(i,(int)Math.pow(10,i-1));}// +10for(int i=0;i<10;i++){map.put(i,(int)Math.pow(i,n));}//最大值 +1int max = (int)Math.pow(10,n) -1;//最小值 +1int min = (int)Math.pow(10,n-1);// 10^(n) - 10^(n-1) -1for(int i = min;i<max+1;i++){// 各位三次幂和存储 +1int sum = 0;// 临时位数 +1int s = n;int si = i;// 5(n-1)while (s > 0 && si>0 ){int powi = powMap.get(s);int temp = si/powi;sum  += map.get(temp);s--;si = si-temp*powi;}if(i == sum){ret.add(i);}}return ret;}

接下来需要考虑的问题

1,算法是否正确

2,算法复杂度如何

3,算法是否需要优化

算法是否正确

1位自幂数:[1, 2, 3, 4, 5, 6, 7, 8, 9]
2位自幂数:[]
3位自幂数:[153, 370, 371, 407]
4位自幂数:[1634, 8208, 9474]
5位自幂数:[54748, 92727, 93084]
6位自幂数:[548834]
7位自幂数:[1741725, 4210818, 9800817, 9926315]
8位自幂数:[24678050, 24678051, 88593477]
9位自幂数:[146511208, 472335975, 534494836, 912985153]

结果验证无误,说明算法思路没有问题。

算法复杂度

时间复杂度:15+n+(9 * 10^(n-1) -1) * (4+5n)

指数级时间复杂度,遇到指数级炸弹

是否需要优化

8位用5秒,9位用50秒,按目前int位来说还可忍受, 按百度百科给出的最大位数39,该算法不可能达到,算法需要重构优化


目前对优化还没有思路,待研究透彻再补充,如果有思路的欢迎留音讨论

经典算法|水仙花数|自幂数相关推荐

  1. C++经典案例水仙花数

    C++经典案例水仙花数 目录 C++经典案例水仙花数 1.案例描述 2.注意点 3.代码演示 1.案例描述 案例描述:水仙花数是指一个三位数,它的每个位上数字的3次幂之和等于它本身 例子:153=1^ ...

  2. 有趣的算法-----水仙花数问题2

    本文将为大家带来"水仙花数问题2"算法的一个解法与详细解释,方法不唯一,本篇文章只列举出一种方法,可以先练习,练习之后查看代码,这样更加有助于提高. 文章目录 一. 题目 二.代码 ...

  3. Java实现 基础算法 水仙花数

    public class 水仙花数 {public static void main(String[] args) {for (int i = 100; i < 1000; i++){int a ...

  4. C语言经典题目 水仙花数,C语言经典练习题:水仙花数

    废话不说直接进入正题:传说中的水仙花数就是一个三位数的各个位数的三次方之和就是这个数本身例如153=1*1*1+5*5*5+3*3*3. 好,开始解题:首先,题中已经说了水仙花数是一个三位数,也就是说 ...

  5. Java 求解自幂数(水仙花数)

    文章目录 什么是自幂数 Java pow() 方法扩展 如何求自幂数 什么是水仙花数 如何求水仙花数 附:常见水仙花数 什么是自幂数 如果在一个固定的进制中,一个 n 位自然数等于自身各个数位上数字的 ...

  6. Java Stream来写算法01——自幂数(水仙花数)

    总目录 自幂数,就是一个长度为nnn的自然数,等于自身各个位上数字的nnn次幂的和. 例如十进制中:153=13+53+33153=1^3+5^3+3^3153=13+53+33,153是3位数,每一 ...

  7. 《算法竞赛入门经典》(第二版) 习题2-1 水仙花数(daffodil)

    习题2-1 水仙花数(daffodil) 输出100~999中的所有水仙花数.若三位数满足ABC=A3+B3+C3,则称其为水仙花数.例如153 = 13 + 53 + 33,所以153是水仙花数. ...

  8. c语言水仙花数算法流程图,C语言经典算法例题求100-999之间的“水仙花数

    #include #include using namespace std; /* 求100-999之间的水仙花数 */ int main() { int number,hun,ten,gw,sum; ...

  9. 关于水仙花数及用Python函数解析水仙花数算法

    今天是第一次写博客,好的开始是成功的一半,加油. 水仙花数(narcissistic number)中的narcissistic本意是"自我陶醉,自赏的,自恋的". 在希腊神话中, ...

最新文章

  1. 1.3. redis-cli - Command-line client to redis-server
  2. windows下ngnix+php配置
  3. 【转】IT名企面试:腾讯笔试题(2)
  4. 训练神经网络适合使用交叉熵(cross_entropy)错误率,而不是分类错误率或是均方差
  5. [转]CPoint+CSize+CRect学习大纲
  6. 框架中的Blob数据的定义
  7. 游戏工委:已有63家单位响应防止未成年人沉迷通知
  8. win2008删除计算机用户,Windws Srv 2008内置账户
  9. Beta版本测试第二天
  10. 如何使用EasyRecovery进行深度扫描和继续扫描
  11. (转)巴菲特的投资智慧--1998年的演讲
  12. 【译】Matplotlib:plotting
  13. GIS三维可视化技术在输电领域的应用研讨
  14. 【LWP,进程,线程】Linux
  15. tkinter将图标写入py文件
  16. Mac(Big Sur系统)安装tunnelblick(vpn)步骤
  17. 三角形的内切圆和外接圆--【英雄会】
  18. PDF文件怎么在线压缩?教你在线压缩的方法
  19. (BY框架)多产品多外协工序合同(加工协议书)预览
  20. 华为android能用几年,最强的国产安卓,一部华为手机能用多久?

热门文章

  1. 软考总结之网络+病毒攻击类型
  2. 全景拍摄怎么拍?关于vr全景这些拍摄技巧你都知道吗?
  3. C#实现的域名和网页有效性批量查询工具
  4. nacos与mysql连接报NullPointException问题
  5. firefox关闭浏览器缓存步骤:
  6. Mac for Eclipse 闪退
  7. 名字转换(java)
  8. 爬虫原理及反爬虫机制以及反爬虫方法的应对策略
  9. “石头汤与煮青蛙”中的催化剂
  10. HL-340 usb转串口线驱动