共63道题,当前是第57

Description

1   #include <iostream>
2   using namespace std;
3   
4   int c[100], n, s, cnt, ans;
5   
6   void calln(int x) {
7       while (x) {
8           n++;
9           x >>= 1;
10      }
11  }
12
13  int bitcount(int x) {
14      int cnt = 0;
15      while (x) {
16          cnt += x & 1;
17          x >>= 1;
18      }
19      return cnt;
20  }
21
22  int main() {
23      cin >> s;
24      calln(s);
25      for (int i = s; i; i = s & (i-1)) {
26          cnt++;
27          c[bitcount(i)] += i;
28      }
29      for (int i = 1; i <= n; i++)
30          ans = max(ans, c[i]);
31      cout << cnt << endl;
32      cout << ans << endl;
33      return 0;
34  }
假设输入的 $s$ 为正整数且不超过 $10^9$,完成下面的判断题和单选题:


1. 正确。 设 $len$ 表示 $s$ 的二进制表示中共有多少位为 $1$,而 $cnt=2^len-1$,而具有 $len$ 位 $1$ 的所有二进制整数中数值最小的即为 $2^len-1$,所以 $cnt<=s$ 成立,或者换个简单的思路,i 永远在变小,那么最起码也是每次 $-1$,所以 $i$ 的变化次数最多就是 $s$
2. 错误。 $bitcount(x)$ 函数计算的是 $x$ 的二进制表示中共有多少位为 $1$。
3. 错误。数组下标对应的是 $i$ 的二进制数表示中 $1$ 出现的位数,对于 $1 \sim 10^9$ 范围内的整数,其二进制表示中 $1$ 出现的位数不会超过 $100$,所以不会发生数组越界。
4. C。$(23)_{10}=(10111)_2$,所以 $len=4$,得 $cnt=2^len-1=15$。
5. D。 $c[1]=8+2+1=11,c[2]=10+9+3=22,c[3]=11$,得 $ans=22$。
6. B。通过分析代码可得 $c[i]=(C_len^i⋅i)/len⋅127$,所以 $c[1] = 127,c[2] = 762,c[3] = 1905,c[4] = 2540,c[5] = 1905,c[6] = 762,c[7] = 127$,得 $ans=2540$。

Question

输出的第一行不会超过输入的 $s$。( )

$bitcount(x)$ 函数用于计算 $x$ 对应的二进制整数的位数。( )

输入的 $s$ 不应大于 $100$,否则会发生数组越界。( )

当输入的 $s$ 为 $23$ 时,输出的第一行整数为( )。

当输入的 $s$ 为 $11$ 时,输出的第二行整数为( )。

当输入的 $s$ 为 $127$ 时,输出的第二行整数为( )。