1 条题解

  • 0
    @ 2022-11-22 8:14:33

    吾的想法是从右往左遍历每一位二进制位(这样判断是否补零比较方便),依次进行位运算,最后翻转输出. main code:

    /*
    n1:第一个二进制数
    n2:第二个二进制数
    mod:运算符号
    n1v:n1下标
    n2v:n2下标
    n1now:n1当前位
    n2now:n2当前位
    */
    n1v = n1.size() - 1;
    n2v = n2.size() - 1;
    while (n1v >= 0 || n2v >= 0)
    {
        char n1now , n2now;
        //判断是否补零
        if (n1v < 0) n1now = '0';
        if (n2v < 0) n2now = '0';
    
        if (n2v >= 0) n2now = n2[n2v];
        if (n1v >= 0) n1now = n1[n1v];
        //进行对应位运算
        if (mod == "or")
        {
            if (n1now == '0' && n2now == '0') ans += '0';
            else ans += '1';
        }
        else if (mod == "and")
        {
            if (n1now == '1' && n2now == '1') ans += '1';
            else ans += '0';
        }
        else
        {
            if (n1now != n2now) ans += '1';
            else ans += '0';
        }
        
        n1v--;
        n2v--;
    }
    
    bool have1 = false;//have1记录结果中是否出现1
    //翻转输出
    for (int i = ans.size() - 1 ; i >= 0 ; i--)
    {
        if (ans[i] == '1')
        {
            have1 = true;
        }
        //判断是否为前导零,即第一次出现1之前的每一位
        if (!(have1))
        {
            continue;
        }
        cout << ans[i];
    }
    //特判,若每一位都是0,则输出0
    if (!(have1))
    {
        cout << "0";
    }
    
    • 1

    【基础】小 X 与位运算(bignum)

    信息

    ID
    277
    时间
    1000ms
    内存
    64MiB
    难度
    8
    标签
    递交数
    41
    已通过
    7
    上传者