V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
bufannao
V2EX  ›  问与答

求算法, 1,2,4,8,16…………,给出任意数如 15,如何计算出 15 是由 1, 2, 4, 8 相加得到的?即 15=1&2&4&8,而 13=1&4&8

  •  
  •   bufannao · Jun 6, 2015 · 3990 views
    This topic created in 3979 days ago, the information mentioned may be changed or developed.
    21 replies    2015-06-07 10:00:25 +08:00
    Xs0ul
        1
    Xs0ul  
       Jun 6, 2015 via Android
    看看十进制整数转换为二进制的算法
    wbingeek
        2
    wbingeek  
       Jun 6, 2015
    除二取余
    hpeng
        3
    hpeng  
       Jun 6, 2015 via Android
    算二进制位数的1。位运算即可
    bufannao
        4
    bufannao  
    OP
       Jun 6, 2015
    能给个算法么?
    function count($num){
    // $num = 13
    ……
    return $result; // array[1,4,8]
    }
    zhjits
        5
    zhjits  
       Jun 6, 2015 via Android
    bufannao
        6
    bufannao  
    OP
       Jun 6, 2015
    @zhjits 没想好怎么把1101计算出是8,4,1,而把1001计算出是8,1
    ebony0319
        7
    ebony0319  
       Jun 6, 2015 via Android
    @wbingeek 二楼正解,因为可能还有其余的结果,比如1'2'3'4'5
    ebony0319
        8
    ebony0319  
       Jun 6, 2015 via Android
    说错了,但是二楼是正解
    wy315700
        9
    wy315700  
       Jun 6, 2015   ❤️ 1
    $i = 1;
    $result = array();
    while($num){
    if($num & 1){
    $result[] = $i;
    }
    $i *= 2;
    $num /= 2;
    }
    zyue
        10
    zyue  
       Jun 6, 2015
    不就是转为二进制么
    zhs227
        11
    zhs227  
       Jun 6, 2015   ❤️ 1
    php有现成的函数转二进制。话说直接求代码真是个不好的方式,至少这个问题很简单。

    function count_a($num) {
    $result = [];
    foreach (array_reverse(str_split(decbin($num))) as $k=>$v ) {
    if ($v) {
    $result[] = 1<<$k;
    }
    }
    return $result; // array[1,4,8]
    }
    SoloCompany
        12
    SoloCompany  
       Jun 6, 2015 via iPad   ❤️ 1
    toString(2)
    b821025551b
        13
    b821025551b  
       Jun 6, 2015
    加号写成按位与也是醉了,我反应半天才反应过来
    imn1
        14
    imn1  
       Jun 6, 2015
    换成二进制,看哪位有1就知道了
    这是用整数作为权限表常见方法
    bufannao
        15
    bufannao  
    OP
       Jun 6, 2015 via Android
    @b821025551b 嗯,是写错了
    @zhs227 自己其实之前有写过代码,用的for循环,总感觉效率不高,看了大家的收益了
    bufannao
        16
    bufannao  
    OP
       Jun 6, 2015 via Android
    @imn1 用在多选题选项上了
    Jaylee
        17
    Jaylee  
       Jun 6, 2015
    求子集
    xff1874
        18
    xff1874  
       Jun 6, 2015
    1 先排序
    2 用贪婪算法
    327beckham
        19
    327beckham  
       Jun 7, 2015
    算法的话,加减乘除的速度有点慢了。用位运算的方式来弄吧。
    msg7086
        20
    msg7086  
       Jun 7, 2015
    发个ruby的好了

    def bin n
    l = []
    while n > 0 do m, n = n, n & (n-1); l << m - n end
    l
    end

    p bin 15 #-> [1, 2, 4, 8]
    msg7086
        21
    msg7086  
       Jun 7, 2015
    或者写成one line的话

    bin = -> (n) {Enumerator.new{|e| while n > 0 do m, n = n, n & (n-1); e.yield m - n end}.to_a}

    p bin.call 15 #-> [1, 2, 4, 8]
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5006 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 88ms · UTC 01:08 · PVG 09:08 · LAX 18:08 · JFK 21:08
    ♥ Do have faith in what you're doing.