Code Kata:超级偶数数列 javascript实现
超级偶数(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实现的更多相关文章
- VS Code - Debugger for Chrome调试JavaScript的两种方式
VS Code - Debugger for Chrome调试JavaScript的两种方式 最近由于出差的缘故,博客写的不是很多,一直想写一篇VS Code - Debugger for Chrom ...
- 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 ...
- Code Kata:大整数比较大小&大整数四则运算---加减法 javascript实现
大整数的四则运算已经是老生常谈的问题了.很多的库也已经包含了各种各样的解决方案. 作为练习,我们从最简单的加减法开始. 加减法的核心思路是用倒序数组来模拟一个大数,然后将两个大数的利用竖式进行运算. ...
- 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的螺旋矩阵 我的思路如下: 第一步:拆分 ...
- Code Kata:大整数四则运算—除法 javascript实现
除法不可用手工算法来计算,其基本思想是反复做减法,看从被除数里面最多能减去多少个除数,商就是多少. 除法函数: 如果前者绝对值小于后者直接返回零 做减法时,不需要一个一个减,可以以除数*10^n为基数 ...
- Code Kata:大整数四则运算—乘法 javascript实现
上周练习了加减法,今天练习大整数的乘法运算. 采取的方式同样为竖式计算,每一位相乘后相加. 乘法函数: 异符号相乘时结果为负数,0乘任何数都为0 需要调用加法函数 因为输入输出的为字符串,需要去除字符 ...
- Code optimization and organization in Javascript / jQuery
This article is a combined effort of Innofied Javascript developers Puja Deora and Subhajit Ghosh) W ...
- 裴波那契数列 JavaScript 尾递归实现
一般递归实现 : //经典递归 function fibonacci(n) { return (function(n) { ) ; ); })(n); } 或者: function fibonacci ...
- Passing JavaScript Objects to Managed Code
Silverlight If the target managed property or input parameter is strongly typed (that is, not typed ...
随机推荐
- 【机器学习实战】第 10 章 K-Means(K-均值)聚类算法
第 10 章 K-Means(K-均值)聚类算法 K-Means 算法 聚类是一种无监督的学习, 它将相似的对象归到一个簇中, 将不相似对象归到不同簇中.相似这一概念取决于所选择的相似度计算方法.K- ...
- xml文件的方式实现动态代理基于SpringAOP
1.配置spring容器 导入jar包 com.springsource.net.sf.cglib-2.2.0.jar com.springsource.org.aopalliance-1.0.0.j ...
- python生成式
本篇将介绍Python的列表生成式,更多内容请参考:Python列表生成式 列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. 举个 ...
- SharePoint Server 2013 安装篇 - 如何解决无法找到 .net 4.5 的问题
SharePoint Server 2013 在安装前,是不能安装 VS 等会自动安装 .net 4.5.x 以上版本的 .net Framework 的软件的.因为安装了 .net Framewor ...
- Android 开发笔记___SQLite__基本用法
SQLiteOpenHelper package com.example.alimjan.hello_world.dataBase; import android.content.ContentVal ...
- js实现查找字符串中最多的字符的个数
用hash table实现.key是字符,value是字符个数. var hashTable={}; var str="fjsdeiuwidshjfhjsksghfjhsjjskalsk&q ...
- SVG绘制loading效果
<div class="loading"> <svg width='40px' height='40px' xmlns="http://www.w3.o ...
- 常用meta整理[转载]
< meta > 元素 概要 标签提供关于HTML文档的元数据.元数据不会显示在页面上,但是对于机器是可读的.它可用于浏览器(如何显示内容或重新加载页面),搜索引擎(关键词),或其他web ...
- display:none,float小秘密
一个元素不管是块元素还是行内元素 在添加了 display:none 之后,就变成了不可见的块元素,可以给他添加长度和高度 在float之后内联元素也会隐性成为 inline-block ...
- 让普通 Java 类自动感知 Activity Lifecycle
背景 在 Android 开发中,我们都很熟悉 Activity 的 Lifecycle,并且会在特定的 Lifecycle 下执行特定的操作.当然,我们清楚 Lifecycle 本身是带有 Andr ...