正在载入在线练习界面,本页内容可直接阅读…

AK CSP › CSP-J 2021 第一轮真题 › 第 19 题

CSP-J 2021 第一轮 第 19 题:程序(一):输入1 511998的输出

阅读程序 · 程序基本概念与数据类型 · 难度 中等 · 答案 A

题目

#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;
}
CSP-J 2021 第一轮 第 19 题 原题
原题扫描(页面加载后可直接在线作答)

本小题

当输入为 1 511998 时,输出为 18。( )

选项

  • A. 正确
  • B. 错误

答案

A

题解

选 A. 正确。关键是看懂 f 和 g 的作用。

1. f(x):统计二进制中有多少个 1

每执行一次 x &= x - 1,就会把 x 的二进制中最右边的一个 1 变成 0。因此,循环次数就是 1 的个数。

511998 的二进制为(分组方便计数):

``text 0111 1100 1111 1111 1110 ``

其中有 3 + 2 + 4 + 4 + 3 = 16 个 1,所以 f(511998) = 16。

2. g(x):取出二进制中最右边的 1 所代表的值

x & -x 是常见的 lowbit 运算。511998 的二进制末尾为 10,最右边的 1 代表的值是 2,所以 g(511998) = 2。

输入中 n = 1,只处理一个数,输出为:

``text 16 + 2 = 18 ``

因此题目说法正确。(程序实际还会在 18 后输出一个空格,然后换行。)

真题版权归 CCF 所有,本站仅用于非商业教学用途。页面加载后可直接在线作答,作答记录保存在本浏览器或账号中。 京ICP备2026056990号-1 京公网安备11010502062986号