如何将任何正整数拆分成多个2的n次幂之和的形式

23 篇文章 0 订阅
15 篇文章 0 订阅

&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++这种,这个就看个人喜好了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值