JS练习题-Harshad numbers

在Codewars上面练习,现在到6级的题目了(数字越小越难)

这道题叫Harshad or Niven numbers,

原题http://www.codewars.com/kata/54a0689443ab7271a90000c6/train/javascript (可以先自己做做看哦)

Harshad number就是一个数可以被自己各个位上的数之和整除的数

比如588, 5 + 8 + 8 = 21,588 =21 * 28

题目是建立一个对象,有三个方法,

isValid(number)判断是否是Harshad number // Harshad.isValid( 1 ) returns true

getNext (number) 返回下一个Harshad number// Harshad.getNext( 0 ) returns 1

getSerie(count, start) 传入两个参数,一个是数量,一个是起始点(可选) 返回一个数组

// Harshad.getSerie( 3, 1000 ) returns [ 1002, 1008, 1010 ], while // Harshad.getSerie( 3 ) returns [ 1, 2, 3 ]

测试用例的范围是前2000个Harshad Number

以下是我的实现代码

var Harshad = ( function() {
  'use strict';
  //定义一个空集
  var arr=[];
  //循环初始值i
  var i=0;
  //当数组长度小于等于2000时执行循环
  while(arr.length<2000) {
      //求得各位数值的和
      var digitSum=i.toString().split("").reduce(function(a,b){
      return parseInt(a)+parseInt(b);
  });
      //如果可以整除,则加入数组中
      if(i%digitSum===0){arr.push(i);}
      i++;
  }
  return {
    isValid: function( number ) {
      return arr.indexOf(number)!==-1;
    },
    getNext: function( number ) {
      return arr[arr.indexOf(number)+1];
    },
    getSerie: function( count, start ) {
        start=start||0;
        var filterArr=arr.filter(function(b){
            return b>start;
        });
      return filterArr.slice(0, count);
    }
  };

} () );

一.求各数值的和

var digitSum=i.toString().split("").reduce(function(a,b){
      return parseInt(a)+parseInt(b);
  });

这一段我的思路是,先把i 转换为字符串,然后用split将各位分割开,再用数组的reduce函数,将各个字符串转回数字后相加

关于reduce函数,参见张鑫旭大大的http://www.zhangxinxu.com/wordpress/2013/04/es5%E6%96%B0%E5%A2%9E%E6%95%B0%E7%BB%84%E6%96%B9%E6%B3%95/#indexof

二.进行测试时遭遇的两个小陷阱

1.getSerie方法传的参数start可能不是Harshad数,所以我是用filter方法(用法也参见上一个链接),把原数组截成了大于start这个数的数组

2.坑还是在这个start上,这个参数是可选的,有些测试用例没有传,也就是默认是0。由于codewars支持es6语法,所以最简单的是

getSerie: function( count, start=1 )

不过如果还没用babel,还不支持ES6,就加这么一句

start=start||0;

这就是传统的设置默认参数的方法了

这道题就学到这里啦

每天进步一点点:)

个人简历:wzlinsen.com

 
posted @ 2016-03-27 22:25  五木十架  阅读(629)  评论(0编辑  收藏  举报