超级偶数(SuperEven)是指每一位都是偶数的正整数,例如:

0,2,4,6,8,20,22,24,26,28,40,...,88,200,202,...

要求写一个函数,输入项数n,返回数列第n项的值。

说实话,这个题目整整花了我三天时间去思考(数学比较弱,大神见笑)#手动捂脸#。
其实到最后我还是没有完成这个Kata,因为作者要求用少于30个字符的代码解决,我的解决方案再怎么压缩也100个字符左右了。万念俱灰的我还是决定看别人的答案,发现一共有4个人解出来了,答案都一致,非常精妙。但是吹毛求疵的讲,标答也是有瑕疵的。卖个关子,先看看我的解答:

简单介绍一下思路

首先是找规律,既然每一位都是偶数,那么超级偶数的每一位都可以表示为
m=2x*10N 的形式其中 0<=x<=4,N为位数,个位N=0,十位N=1以此类推。
那么每个一个超级偶数M都可以表示为

通过观察发现,位数的变化规律为第 5N-1 项到 5N - 1项的位数位N。可以得到第a项的位数为
 []代表取整数位
同时发现每一位的变化也是有规律的,比如个位0、2、4、6、8为每5次一循环,而十位则为25次一循环,根据规律可以得到
[]代表取整数位

整理一下思路,把公式整合起来,我们设项数为a,第a项的值为M,第a项的位数为N,可以得到


接下来将公式转为js代码

function superEven(n){

    var e='',l = (Math.log(n) / Math.log(5)) | 0;

    while(l >= 0){

            e += (n / Math.pow(5,l)).toString().split('.')[0] % 5 * 2;

        l--;
} return e; };
  • 这里用到了字符串拼接而没有用数字加减,是考虑到了大数字情况下丢失精度的问题。

  • 用'|0'进行位运算取整是为了缩短代码长度,但是后面发现在大数字情况下'|0'出现溢出问题,因此后面修改为了字符串截取小数点前面部分。


经过复杂的计算,我总算把答案拿出来了,然而30个字符解决问题是什么鬼。我想我肯定是从根本上就偏离的题主的想法,于是我怀着惴惴不安的心情浏览了提交上去的答案,结果简直让人震惊!不多说贴代码:

superEven=n=>n.toString(5)*2

不得不说,我确实搞的过于复杂了,万万没想到这竟然是一个5进制的数组。我相信对数字敏感的大神肯定一眼就能看出来了吧。

但是结束了吗,并没有,当我测试两段代码时发现,在超大数据的情况下,纯数学运算是会丢失精度的,但是字符串拼接则不会

上面的结果为我的代码,下面为转5进制方法,node环境下运行速度上几乎可以忽略不计,两者都是小于1ms。
但是下面方法在结果超过17位时,开始丢失精度,并且在超过20位时,强制使用科学计数法


综上所述,标准答案确实是精妙绝伦,令人拍案叫绝,但是我自身的答案也是有可取之处的。
说到底,做练习还是为了提升自我,虽然没能给出最优解,但是过程已经让我受益匪浅了。

如果喜欢我的文章,可以扫描二维码关注我的微信公众号

争取每天都分享一点我自己的开发和练习体验~

Code Kata:超级偶数数列 javascript实现的更多相关文章

  1. VS Code - Debugger for Chrome调试JavaScript的两种方式

    VS Code - Debugger for Chrome调试JavaScript的两种方式 最近由于出差的缘故,博客写的不是很多,一直想写一篇VS Code - Debugger for Chrom ...

  2. Chrome Dev Tools: Code Folding in CSS and Javascript for improved code readiability

    Note : Apply for google chrome canary. You can fold code blocks in CSS (and Sass) and javascript fil ...

  3. Code Kata:大整数比较大小&大整数四则运算---加减法 javascript实现

    大整数的四则运算已经是老生常谈的问题了.很多的库也已经包含了各种各样的解决方案. 作为练习,我们从最简单的加减法开始. 加减法的核心思路是用倒序数组来模拟一个大数,然后将两个大数的利用竖式进行运算. ...

  4. Code Kata:螺旋矩阵 javascript实现

    1 2 3 4  5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9  如图所示,就是一个5*5的螺旋矩阵 我的思路如下: 第一步:拆分 ...

  5. Code Kata:大整数四则运算—除法 javascript实现

    除法不可用手工算法来计算,其基本思想是反复做减法,看从被除数里面最多能减去多少个除数,商就是多少. 除法函数: 如果前者绝对值小于后者直接返回零 做减法时,不需要一个一个减,可以以除数*10^n为基数 ...

  6. Code Kata:大整数四则运算—乘法 javascript实现

    上周练习了加减法,今天练习大整数的乘法运算. 采取的方式同样为竖式计算,每一位相乘后相加. 乘法函数: 异符号相乘时结果为负数,0乘任何数都为0 需要调用加法函数 因为输入输出的为字符串,需要去除字符 ...

  7. Code optimization and organization in Javascript / jQuery

    This article is a combined effort of Innofied Javascript developers Puja Deora and Subhajit Ghosh) W ...

  8. 裴波那契数列 JavaScript 尾递归实现

    一般递归实现 : //经典递归 function fibonacci(n) { return (function(n) { ) ; ); })(n); } 或者: function fibonacci ...

  9. Passing JavaScript Objects to Managed Code

    Silverlight If the target managed property or input parameter is strongly typed (that is, not typed ...

随机推荐

  1. css 文字和子元素水平垂直居中

    关于水平垂直居中,这是一个很简单的问题,但是很多时候,往往简单的东西,反而做不出来.这就是基础不扎实的缘故吧,我参照一些资料,总结了水平垂直居中的几种方法如下: 1 .文字水平垂直居中 这个比较简单, ...

  2. LeetCode 548. Split Array with Equal Sum (分割数组使得子数组的和都相同)$

    Given an array with n integers, you need to find if there are triplets (i, j, k) which satisfies fol ...

  3. Python 由__dict__和dir()引发的一些思考

    关于__dict__和dir()的区别和作用请参考这篇文章:http://blog.csdn.net/lis_12/article/details/53521554 说下我当时遇到的问题: class ...

  4. vuex的简易入门

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neue"; color: #454545 } p. ...

  5. POJ3468(线段树 区间修改 lazy-tag)

    我的线段树真的没救了......还是多练几道吧....... You have N integers, A1, A2, ... , AN. You need to deal with two kind ...

  6. 暑假练习赛 007 C - OCR

    C - OCR Description standard input/outputStatements Optical Character Recognition (OCR) is one of th ...

  7. Python filter用法

    class filter(object) | filter(function or None, iterable) --> filter object | | Return an iterato ...

  8. Java简单实现UDP和TCP

    TCP实现 TCP协议需要在双方之间建立连接,通过输入输出流来进行数据的交换,建立需要通过三次握手,断开需要四次挥手,保证了数据的完整性,但传输效率也会相应的降低. 简单的TCP实现 //服务端 pu ...

  9. grid 布局

    display:grid 是一种新的布局方式,旧的布局方式通常有副作用,例如float(需要额外修复浮动)或者inline-block(两个元素之间的空格问题)   把父元素定义为grid,就像表格一 ...

  10. HTML 3秒一换轮播(鼠标选中旋转停止定时) 动画案例

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...