2的幂指数从0开始:2^0、 2^2、 2^3、 2^4、 2^5......,即: 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]
网友评论