• 经典算法|水仙花数|自幂数


    算法题目

     

    水仙花数(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,将符合条件的放入列表

    代码实现 

    1. /**
    2. * 求 自幂数
    3. * @param n 位数
    4. * @return
    5. * @throws Exception
    6. */
    7. public static List sxhGet(int n) throws Exception{
    8. // int的取值范围为:-2^31 ---- 2^31-1 ,即:-2147483648 - 2147483647
    9. if(n > 10){
    10. throw new Exception("no support");
    11. }
    12. // +1
    13. List ret = new ArrayList<>();
    14. // +1
    15. HashMap map = new HashMap<>();
    16. //10 的 0~n 次幂
    17. HashMap powMap = new HashMap<>();
    18. for(int i=1;i<=n;i++){
    19. powMap.put(i,(int)Math.pow(10,i-1));
    20. }
    21. // +10
    22. for(int i=0;i<10;i++){
    23. map.put(i,(int)Math.pow(i,n));
    24. }
    25. //最大值 +1
    26. int max = (int)Math.pow(10,n) -1;
    27. //最小值 +1
    28. int min = (int)Math.pow(10,n-1);
    29. // 10^(n) - 10^(n-1) -1
    30. for(int i = min;i1;i++){
    31. // 各位三次幂和存储 +1
    32. int sum = 0;
    33. // 临时位数 +1
    34. int s = n;
    35. int si = i;
    36. // 5(n-1)
    37. while (s > 0 && si>0 ){
    38. int powi = powMap.get(s);
    39. int temp = si/powi;
    40. sum += map.get(temp);
    41. s--;
    42. si = si-temp*powi;
    43. }
    44. if(i == sum){
    45. ret.add(i);
    46. }
    47. }
    48. return ret;
    49. }

    接下来需要考虑的问题

    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,该算法不可能达到,算法需要重构优化


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

  • 相关阅读:
    试着换个角度理解低代码平台设计的本质
    Streptavidin-MAL,Maleimide 马来酰亚胺修饰/标记/偶联链霉亲和素
    Yii 知识点总结
    Docker使用过程中经常遇见的问题
    基于JAVA摄影网站计算机毕业设计源码+数据库+lw文档+系统+部署
    重温51汇编指令(附实验)
    Linux小程序---进度条
    [Mac软件]Infuse 7 PRO v7.6.3 一个强大的视频播放器(激活版)
    哈夫曼树、哈夫曼编码/解码
    web自动化测试入门篇02——selenium安装教程
  • 原文地址:https://blog.csdn.net/fjza1168/article/details/127566533