&embp;&embp;如题,对任意一个非2的整数幂次的正整数x,都可以将其转换为多个2的n次幂之和,例如
7 = 4 + 2 + 1
54 = 32 + 16 + 4 + 2
60 = 32 + 16 + 8 + 4
。。。。
&embp;&embp;原理是我们可以将这个数写作二进制原码,那原码的每一位就是2的第n次幂,所以可以将其转换。知道了这个,就可以应用到某些题上面,具体的,我们可以用进制运算来实现。
代码/Python
def convertX(x: int) -> List[int]:
b = 1
res = []
times = len(bin(x)[2:])
for _ in range(times):
if b & x == b:
res.append(b)
b <<= 1
return res[::-1]
if __name__ == '__main__':
nums = [5, 98, 66, 78, 15, 65, 39, 77]
answers = []
for a in nums:
print(a, '=', '+'.join(map(str, convertX(a))))
'''
5 = 4+1
98 = 64+32+2
66 = 64+2
78 = 64+8+4+2
15 = 8+4+2+1
65 = 64+1
39 = 32+4+2+1
77 = 64+8+4+1
'''
代码/C++
&embp;&embp;C++实现的话,考虑到int型表示的最大整数为231-1,因此循环可以写成硬循环31次。
vector<int> convertX(int x){
int b = 0x40000000; // 16进制
vector<int> res;
for(int i = 1; i < 32; i++){
if((b & x) == b){
res.push_back(b);
cout << b << " ";
}
b >>= 1;
}
cout << endl;
return res;
}
int main(){
vector<int> nums = {5, 98, 66, 78, 15, 65, 39, 77};
for(auto a: nums){
cout << a << " = ";
convertX(a);
}
return 0;
}
/*
5 = 4 1
98 = 64 32 2
66 = 64 2
78 = 64 8 4 2
15 = 8 4 2 1
65 = 64 1
39 = 32 4 2 1
77 = 64 8 4 1
*/
&embp;&embp;前面python的写法也可以换成像C++这种,这个就看个人喜好了。