• 求不小于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中大整数也支持这些位运算。

  • 相关阅读:
    PIE SDK专题制图下屏幕坐标转地图坐标
    PIE SDK导出图片
    PIE SDK专题制图切换模板
    PIE SDK专题制图另存模板
    PIE SDK专题制图保存模板
    PIE SDK专题制图打开模板
    PIE SDK元素位置和显示样式的修改
    day 16 特殊权限与输入输出相关作业
    day 16 特殊权限和输出输入符
    day 15 权限概述作业
  • 原文地址:https://www.cnblogs.com/weiyinfu/p/6655258.html
Copyright © 2020-2023  润新知