程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2023-05(5)

10万以内快乐数之和

发布于2021-03-07 21:42     阅读(819)     评论(0)     点赞(15)     收藏(3)


首先快乐数定义:快乐数(happy number)有以下的特性:在给定的进位制下,该数字所有数位(digits)的平方和,得到的新数再次求所有数位的平方和,如此重复进行,最终结果必定为1。

如:28 ---> 2*2+8*8=68 ---> 6*6+8*8=100 ---> 1*1+0*0+0*0=1,因此28和68还有100都是快乐数

十万以内快乐数之和(直接上代码):

方法1:

直接复制粘贴在html文档就能跑起来,具体实现原理请看代码注释!

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>10万以内快乐数之和</title>
  6. </head>
  7. <body>
  8. 10万以内快乐数之和:<strong class="num"></strong>
  9. <script src="./jQuery_v2.1.4.js" type="text/javascript" charset="utf-8"></script>
  10. <script type="text/javascript">
  11. var cacheArr = [] //缓存数据
  12. var isHappyNumArr = [] //快乐数
  13. var noHappyNumArr = [] //非快乐数
  14. // 判定是否为快乐数
  15. var ifHappyNum = function(data){
  16. var data = data.toString()
  17. // 如果是快乐数,就把数据放到快乐数arr,清空缓存数据,返回true
  18. if(isHappyNumArr.indexOf(data)>-1){
  19. isHappyNumArr.push(...cacheArr)
  20. cacheArr = []
  21. return true
  22. }
  23. // 如果不是快乐数,就把数据放到非快乐数arr,清空缓存数据,返回false
  24. if(noHappyNumArr.indexOf(data)>-1){
  25. noHappyNumArr.push(...cacheArr)
  26. cacheArr = []
  27. return false
  28. }
  29. // 把每一个计算的数据都放置到缓存当中
  30. cacheArr.push(data)
  31. if(data === '0') return 0
  32. var num = 0
  33. // 计算
  34. for(var i=0; i<data.length; i++){
  35. var item = data[i]
  36. num += item*item
  37. }
  38. // 快乐数,缓存中所有都数据都是快乐数
  39. if(num === 1){
  40. isHappyNumArr.push(...cacheArr)
  41. cacheArr = []
  42. return true
  43. }
  44. //形成闭环表示非快乐数,缓存中所有数据都不是快乐数
  45. if(cacheArr.indexOf(''+num)>-1){
  46. noHappyNumArr.push(...cacheArr)
  47. cacheArr = []
  48. return false
  49. }
  50. // 没返回就递归调用
  51. return ifHappyNum(num)
  52. }
  53. for(var i=1; i<=100000; i++){
  54. ifHappyNum(i)
  55. }
  56. var Nummmmm = 0
  57. for(var j = 0; j<isHappyNumArr.length; j++){
  58. var item = isHappyNumArr[j]
  59. Nummmmm += Number(item)
  60. }
  61. console.log('isHappyNumArr===',isHappyNumArr)
  62. console.log('noHappyNumArr===',noHappyNumArr)
  63. console.log('Nummmmm===',Nummmmm)
  64. $('.num').text(Nummmmm)
  65. </script>
  66. </body>
  67. </html>

此方法先存储两个快乐数和非快乐数都数组集合,然后后边传过来有需要判定的快乐数时就先进行对比,如果已经存储的快乐数集合里边已经有了,就直接返回不用再进行下边的计算判定了,数组当中没有的话就进行计算判定是否为快乐数,此方法大概15S才能跑出结果,因为后边的两个数组越来越大,因此对比是否存在时消耗了大量性能,很是鸡肋,因此我进行了优化版如下!

方法2:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>10万以内快乐数之和</title>
  6. </head>
  7. <body>
  8. 10万以内快乐数之和:<strong class="num"></strong>
  9. <script src="./jQuery_v2.1.4.js" type="text/javascript" charset="utf-8"></script>
  10. <script type="text/javascript">
  11. var cacheArr = [] //缓存数据
  12. var isHappyNumArr = [] //快乐数
  13. var noHappyNumArr = [] //非快乐数
  14. var ifHappyNum = function(data){
  15. var data = data.toString()
  16. // 如果是快乐数,就把数据放到快乐数arr,清空缓存数据,返回true
  17. // if(isHappyNumArr.indexOf(data)>-1){
  18. // isHappyNumArr.push(...cacheArr)
  19. // cacheArr = []
  20. // return true
  21. // }
  22. // 如果不是快乐数,就把数据放到非快乐数arr,清空缓存数据,返回false
  23. // if(noHappyNumArr.indexOf(data)>-1){
  24. // noHappyNumArr.push(...cacheArr)
  25. // cacheArr = []
  26. // return false
  27. // }
  28. // 把每一个计算的数据都放置到缓存当中
  29. cacheArr.push(data)
  30. if(data === '0') return 0
  31. var num = 0
  32. // 计算
  33. for(var i=0; i<data.length; i++){
  34. var item = data[i]
  35. num += item*item
  36. }
  37. // 快乐数,缓存中所有都数据都是快乐数
  38. if(num === 1){
  39. isHappyNumArr.push(...cacheArr)
  40. cacheArr = []
  41. return true
  42. }
  43. //形成闭环表示非快乐数,缓存中所有数据都不是快乐数
  44. if(cacheArr.indexOf(''+num)>-1){
  45. noHappyNumArr.push(...cacheArr)
  46. cacheArr = []
  47. return false
  48. }
  49. // 没返回就递归调用
  50. return ifHappyNum(num)
  51. }
  52. var Nummmmm = 0
  53. for(var i=1; i<=100000; i++){
  54. if(ifHappyNum(i)){
  55. Nummmmm += i
  56. }
  57. }
  58. // var Nummmmm = 0
  59. // for(var j = 0; j<isHappyNumArr.length; j++){
  60. // var item = isHappyNumArr[j]
  61. // Nummmmm += Number(item)
  62. // }
  63. console.log('isHappyNumArr===',isHappyNumArr)
  64. console.log('noHappyNumArr===',noHappyNumArr)
  65. console.log('Nummmmm===',Nummmmm)
  66. $('.num').text(Nummmmm)
  67. </script>
  68. </body>
  69. </html>

此方法实际上就是去掉了参数传进来时的一个indexOf判定,别的没有什么变化,但性能上有很大的提升,大概1S就能出结果。

以上为个人经验总结,如有异议欢迎留言沟通。

 

 

原文链接:https://blog.csdn.net/qq_38382380/article/details/114406458




所属网站分类: 技术文章 > 博客

作者:前端霸主

链接:http://www.qianduanheidong.com/blog/article/33543/9420007cbf3e4b10b903/

来源:前端黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

15 0
收藏该文
已收藏

评论内容:(最多支持255个字符)