正在载入在线练习界面,本页内容可直接阅读…
AK CSP › CSP-J 2021 第一轮真题 › 第 21 题
CSP-J 2021 第一轮 第 21 题:程序(一):输入2 -65536 2147483647的输出
题目
#include <iostream>
using namespace std;
int n;
int a[1000];
int f(int x)
{
int ret = 0;
for (; x; x &= x - 1) ret++;
return ret;
}
int g(int 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;
}
本小题
当输入为 2 -65536 2147483647 时,输出为( )。
选项
- A. 65532 33
- B. 65552 32
- C. 65535 34
- D. 65554 33
答案
B
题解
答案选 B:65552 32。按题目默认的 32 位补码整数计算。
先看两个函数的作用:
f(x):统计二进制中1的个数。每执行一次x &= x - 1,就会消去最低位的一个1,因此循环次数就是1的个数。g(x):x & -x保留最低位的一个1,其余位变成0,返回这一位对应的数值。
① 对于 -65536
它的 32 位补码是: ``text 11111111 11111111 00000000 00000000 ``
有 16 个 1,最低的 1 位于第 16 位(从第 0 位开始计数),对应 \(2^{16}=65536\)。
所以: ``text f(-65536) + g(-65536) = 16 + 65536 = 65552 ``
② 对于 2147483647
它等于 \(2^{31}-1\),二进制是: ``text 01111111 11111111 11111111 11111111 ``
有 31 个 1,最低位就是 1,所以: ``text f(2147483647) + g(2147483647) = 31 + 1 = 32 ``
因此输出为: ``text 65552 32 ``
真题版权归 CCF 所有,本站仅用于非商业教学用途。页面加载后可直接在线作答,作答记录保存在本浏览器或账号中。 京ICP备2026056990号-1
京公网安备11010502062986号