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 ...
随机推荐
- 【UML 建模】状态图介绍
1.Statechart Diagram 即状态图,主要用于描述一个对象在其生存期间的动态行为,表现为一个对象所经历的状态序列.引起状态转移的事件(Event).因状态转移而伴随的动作(Action) ...
- 微信公众号支付|微信H5支付|微信扫码支付|小程序支付|APP微信支付解决方案总结
最近负责的一些项目开发,都用到了微信支付(微信公众号支付.微信H5支付.微信扫码支付.APP微信支付).在开发的过程中,在调试支付的过程中,或多或少都遇到了一些问题,今天总结下,分享,留存. 先说注意 ...
- js 两个日期比较相差多少天
var day1 = new Date("2017-9-17"); var day2 = new Date("2017-10-18"); console.log ...
- sed命令详解 vim高级技巧 shell编程上
第1章 sed命令详解 1.1 查找固定的某一行 1.1.1 awk命令方法 [root@znix ~]# awk '!/oldboy/' person.txt 102,zhangyao,CTO 10 ...
- html浏览器存储连续多个空格,只显示一个空格
这个问题找了很久,发现css的 white-space:pre 完美解决 .white-space { white-space:pre }
- 利用PowerShell 得到 进程总共占用的内存
$task = tasklist /nh /fo csv $total = 0 for($i=0; $i -lt $task.count; $i++) { $one = $task[ $i ].Spl ...
- 面向亿万级用户的QQ一般做什么?——兴趣部落的Web同构直出分享
作者:李强,腾讯web开发工程师 商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处. 原文链接:http://wetest.qq.com/lab/view/348.html 一.什么是同构 ...
- 一个简单的MVC框架的实现
1.Action接口 package com.togogo.webtoservice; import javax.servlet.http.HttpServletRequest; import jav ...
- robotframework自动化系列:新增流程
刚接手项目的时候,要求所有流程在上线之前必须确保正向操作是正确的:这个时候又有新的模块需要测试,所以引入自动化测试是非常有必要的!通过对比,尝试使用RF进行自动化的回归测试. 测试中最常见的操作就是增 ...
- js规范
js规范 Array 和 Object 直接量 为了避免这些歧义, 我们应该使用更易读的直接量来声明. var a = [x1, x2, x3]; var a2 = [x1, x2]; var a3 ...