求不小于N且二进制串包含K个1的最小的数字

给定正整数N,求一个最小正整数M(M>=N),使得M中连续1的个数不小于K。
输入格式:N K

其中N为大整数,只能进行字符串处理

首先要把N化为二进制串,考察这个二进制串的最后K位;
直接把这个二进制串的最后K位改成1就完了?不行,例如N=1011,K=3,此时M为1110,而不是1111
也就是说,要考虑倒数第K+1位,如果是1,那么将K个1左移,右面置0
再考虑倒数第K+2位,如果是1,继续左移,后面置0

sample = [[1646, 12, 4095],
          [1646, 3, 1646],
          [1646, 5, 1660],
          [1646, 4, 1647]
          ]
for N, K, ans in sample:
    s = bin(N)[2:]
    print('ans', bin(ans)[2:], '=' * 10)
    if len(s) <= K:
        print('1' * K)
    else:
        i = len(s) - K - 1
        while s[i] == '1':
            i -= 1
        ss = s[:i + 1] + '1' * K
        ss += (len(s) - len(ss)) * '0'
        print(ss)

鹏哥说有的人就写了几行就完事了,我也会,只是思维太慢了

sample = [[1646, 12, 4095],
          [1646, 3, 1646],
          [1646, 5, 1660],
          [1646, 4, 1647]
          ]
for N, K, ans in sample:
    ss = int((bin(N | ((1 << K) - 1)).strip('1')[2:] + '1' * K + (len(bin(N)) - 2) * '0')[:max(len(bin(N)) - 2, K)],2)
    print('ans', ans, ss)

解释:
bin(N)|((1<<K)-1)得到'0b110111'这样的结果,让它把末尾的1全部删掉,然后重新拼接上K个1,最后补充若干个0。因为补0补得有点多,所以再截取一下,最后将字符串解释成int
在python中大整数也支持这些位运算。

原文地址:https://www.cnblogs.com/weiyinfu/p/6655258.html