zoukankan      html  css  js  c++  java
  • 求不小于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中大整数也支持这些位运算。

  • 相关阅读:
    Sokect简单入门(1)TCP协议一
    Tomcat内存溢出 解决方法
    服务器配置 ssl 证书,Nginx配置
    优秀的博客文章记录
    SpringBoot实现优雅的关机
    关于 redis 的 数据类型 和 内存模型
    微信, qq 支付宝 等相关开发 资源 记录
    设计模式 之 单列设计模式
    Swagger
    MQ服务器奔溃解决过程
  • 原文地址:https://www.cnblogs.com/weiyinfu/p/6655258.html
Copyright © 2011-2022 走看看