超级偶数(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. C GOTO使用示例

    GOTO虽然会破坏程序的结构,使用代码可读性变差,但是GOTO依然还是有可用的地方 #include <stdio.h>#include <stdbool.h> int mai ...

  2. electron 写入注册表 实现开机自启动

    windows平台 首先先明确:开机自启动写入注册表的位置,在KEY_CURRENT_USER\Software\\Microsoft\\Windows\\CurrentVersion\\Run 打开 ...

  3. Unix时代的开创者Ken Thompson

    自图灵奖诞生以来,其获得者一直都是计算机领域的科学家与学者,而在所有这些界的图灵奖中只有唯一的一届有个例外,那就是Ken Thompson与Dennis M. Ritchie,他们都是计算机软件工程师 ...

  4. sql执行报错--This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

    问题: 不支持使用 LIMIT 子句的 IN/ALL/ANY/SOME 子查询,即是支持非 IN/ALL/ANY/SOME 子查询的 LIMIT 子查询. 解决: 将语句:select * from ...

  5. LeetCode 697. Degree of an Array (数组的度)

    Given a non-empty array of non-negative integers nums, the degree of this array is defined as the ma ...

  6. UWP Popup 弹出

    一:需求 做一个类似于安卓的弹出消息框,如图.当用户点击下载或者选择时,能够从底部弹出一个提示框,用于提示用户. 二:Popup 类 不需要我们自己额外去写一个弹窗类,微软自己有一个Popup 弹窗类 ...

  7. java自动化-juint框架简述

    本人使用的是java的juint框架来组织的自动化测试,故我这边需要简单介绍一下juint框架 首先,建议自行百度一下juint框架,先有一个大概的了解 所谓的接口自动化测试,会对多个接口中每一个接口 ...

  8. Apache和Tomcat整合(一个Apache 不同域名处理多个不同业务)

    一.简介 在项目中,几乎任何一个项目都包括静态资源和动态请求两大部分.特别对于门户网站这样的项目,静态内容资源会更多,我们使用一般的 Tomcat 部署时,Tomcat 对静态资源的处理能力比较慢,至 ...

  9. 学习笔记TF059:自然语言处理、智能聊天机器人

    自然语言处理,语音处理.文本处理.语音识别(speech recognition),让计算机能够"听懂"人类语音,语音的文字信息"提取". 日本富国生命保险公司 ...

  10. 工控SCADA模型 基于HTML5 Canvas WebGL制作摩托车

    工业方面制作图表,制作模型方面运用到 3d 模型是非常多的,在一个大的环境中,构建无数个相同的或者不同的模型,构建起来对于程序员来说也是一件相当头疼的事情,我们利用 HT 帮大家解决了很大的难题,以下 ...