2的冪指數(2的N次方)從0開始:20、 21、 22、 23、 24、 25......,即: 1、2、4、8、16、32......
任意的正整數都可以由不重復的2的冪指數之和組成,如 14可以表示為 14 = 2+4+8;這里2,4,8不會重復
const arr = [] // 要輸出的結果
let times = 0 // 除以2的次數
/**
*@param num { number } 要分解的數,必須是正整數
* */
function judgeOdevity(num) {
let splitNum;
if (num < 1) return
// 判斷數字奇偶性,直到數字小于1為止
if (num % 2) { // 奇數
// 2的指數冪只有1為奇數, 所以這個冪指數可以由1和一個偶數來表示,1不能再拆分,所以應該拿出放入結果集
// 因為這個1是除以2得到的值,所以這個1應該用2的拆分次數冪表示(2^times)
arr.push(Math.pow(2, times))
// 減掉1(num - 1)再除以2,得到新的數字
splitNum = (num - 1) / 2
} else { // 偶數
// 直接除以2(num/2)得到新的數字
splitNum = num / 2
}
// 判斷新數字的奇偶性,times加1
times += 1
judgeOdevity(splitNum)
}
// 輸入要拆分的正整數
judgeOdevity(13)
// 查看輸出結果
console.log(arr)
測試
- 測試1: 輸入 47,得到 [1, 2, 4, 8, 32]
- 測試2: 輸入 7,得到 [1, 2, 4]
- 測試3: 輸入 13,得到 [1, 4, 8]