在Codewars上面練習,現在到6級的題目了(數字越小越難) 這道題叫Harshad or Niven numbers, 原題http://www.codewars.com/kata/54a0689443ab7271a90000c6/train/javascript (可以先自己做做看哦) Har ...
在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