跳转至

CSP-J 2021 初赛 阅读程序 第1题

#include <iostream>
using namespace std;

int n;
int a[1000];

int f(int x)
{
    int ret=0;

    // lowerbit()
    // 二进制下,每一次干掉最后一个1
    // 00000110    6
    // 00000101    5
    // 00000100    x & x - 1
    for(; x; x &= x - 1) ret++;

    return ret;
}

int g(int x)
{
    // 二进制下,只保留最后一个1
    // 00000110    6
    // 11111010   -6, 取反加1, 在计算机中,负数以其正值的补码形式表达
    // 00000010    x & -x
    return x & -x;
}

int main()
{
    cin >> n;
    for(int i = 0; i < n; i++) cin >> a[i];
    for(int i = 0; i < n; i++)
        cout << f(a[i]) + g(a[i]) << ' ';
    cout << endl;

    return 0;
}

img

 错。a[1000], 下标0~999,输入1001时,越界

img

错。看程序的作用,这并不会死循环

img

错。输入5个数,2 11 9 16 10
f(10) = 2, g(10) = 2, 对应的输出是4

img

对。511998的二进制是 (1111100111111111110)2
f( ) = 16, g( ) = 2, 输出18

img

错。函数没声明,会CE

img

B
-65536
65536 = 2^16, 
(0000000000000001000000000000000)2
(1111111111111110111111111111111)2
(1111111111111111000000000000000)2, 16个1+16个0
输出 16 + 65536 = 65552

2147483647 = 2^31 - 1
(0111111111111111111111111111111)2, 31个1
输出 31 + 1 = 32