学习C++从娃娃抓起!记录下CSP-J备考学习过程中的题目,记录每一个瞬间。
附上汇总贴:历年CSP-J初赛真题解析 | 汇总_热爱编程的通信人的博客-CSDN博客
#include <iostream>
using namespace std;
int n;
int a[1000];
int f(int x) //统计x转为二进制后1的个数
{
int ret = 0;
for (; x; x &= x - 1) ret++;
return ret;
}
int g(int x) //获取x转为二进制后1的最低位
{
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;
}
16、输入的n等于1001时,程序不会发生下标越界。( )
【答案】:错
【解析】
a[1000]的下标范围为a[0] - a[999],所以a[1000]会导致越界
17、输入的a[i]必须全为正整数,否则程序将陷入死循环。( )
【答案】:错
【解析】
尝试将一个负数带入运算,f函数的二进制运算逻辑没有发生变化,也不会陷入死循环。另外第21题就有负数输入
18、当输入为“5 2 11 9 16 10”时,输出为“3 4 3 17 5”。( )
【答案】:错
【解析】
输入数据后逐个计算,输出为3 4 3 17 4
19、当输入为“1 511998”时,输出为“18”。( )
【答案】:对
【解析】
511998转为二进制后为01111100111111111110,计算的结果为18,所以是对的
20、将源代码中g函数的定义(14-17行)移到main函数的后面,程序可以正常编译运行。( )
【答案】:错
【解析】
运行main函数时,如果g函数未被声明,是无法调用的
21、当输入为“2 -65536 2147483647”时,输出为( )。
A.“65532 33”
B.“65552 32”
C.“65535 34”
D.“65554 33”
【答案】:B
【解析】
2147483647换算为二进制后,是2^32-1,即有31个1,所以输出为32,选B