GESP 客观题评测系统
2024-12-Level-3
2024-12-Level-3
试卷解析总览,可直接查看每题答案与解析。
第 1 题(单选题)
下列二进制表示的十进制数值分别是()
1 [10000011] 原 = ( )
2 [10000011] 补 = ( )
正确答案B
解析详情
【答案】B 【考点】原码与补码转换 【解析】1. [10000011]原:首位为1表示负数,数值位0000011为3,故为-3。2. [10000011]补:首位为1表示负数,补码转原码需逆向操作(减1取反或取反加1)。数值位0000011取反为1111100,加1为1111101,即125。故为-125。 【易错点】混淆补码与原码的转换规则。
第 2 题(单选题)
关于计算机中的编码,下列说法中错误的是()
正确答案D
解析详情
【答案】D 【考点】计算机编码规则 【解析】负数的反码是在其原码的基础上,符号位保持不变,其余数值位按位取反。选项D说“各个位取反”包含了符号位,是错误的。 【易错点】忽略符号位在反码转换中不参与取反的规则。
第 3 题(单选题)
16进制数B2025转换成8进制数是()
正确答案A
解析详情
【答案】A 【考点】进制转换(十六进制转八进制) 【解析】十六进制 B2025 转二进制:B(1011) 2(0010) 0(0000) 2(0010) 5(0101),即 10110010000000100101。从右向左每3位一组转八进制:10(2) 110(6) 010(2) 000(0) 000(0) 100(4) 101(5),得到 2620045。 【易错点】二进制转八进制时分组位数错误或方向错误。
第 4 题(单选题)
625.625变成二进制是()。
正确答案A
解析详情
【答案】A 【考点】小数进制转换 【解析】整数部分:625 = 512 + 64 + 32 + 16 + 1 = 2^9 + 2^6 + 2^5 + 2^4 + 2^0,对应二进制 1001110001。小数部分:0.625 = 0.5 + 0.125 = 2^-1 + 2^-3,对应二进制 0.101。合并为 1001110001.101。 【易错点】小数部分转换不熟练。
第 5 题(单选题)
下面逻辑运算中,正确的是()
正确答案D
解析详情
【答案】D 【考点】C++ 位运算与逻辑运算 【解析】A选项 5&&3==0 结果为 0;B选项 5|3 为 7,7==8 为 0;C选项 5||3 为 1,1==11 为 0;D选项 5&3 为 101&011=001 (1),1==1 为 1(真)。注意优先级:== 高于 &。 【易错点】忽略运算符优先级,先做位运算再做比较运算。
第 6 题(单选题)
补码1111 1101进行运算1111 1101>>1以后得到的结果是()
正确答案B
解析详情
【答案】B 【考点】C++ 位移运算(算术右移) 【解析】补码 1111 1101 表示负数。右移 1 位执行算术右移,符号位补 1,得到 1111 1110。由于 OCR 缺失或选项混乱,基于答案 B 对应预期补码运算结果。 【易错点】对负数补码右移位补 1 的规则不熟悉。
第 7 题(单选题)
下列代码输出的是
string s="1234@@chenadai";
string str="12345";
s.replace(1,5,str);
cout<<s<<endl;正确答案C
解析详情
【答案】C 【考点】C++ string 类的 replace 函数 【解析】`s.replace(1, 5, str)` 表示从索引 1 开始,替换长度为 5 的子串。原串 `1234@@chenadai` 索引 1 开始长度 5 为 `234@@`。将其替换为 `12345` 得到 `1112345chenadai`。 【易错点】错误计算子串的起始位置或长度。
第 8 题(单选题)
a|10(a与10都是10进制,且二进制表示最高位为1)运算的结果是()。
正确答案A
解析详情
【答案】A 【考点】C++ 按位或运算 【解析】十进制 10 的二进制是 1010。执行 `a | 1010` 后,无论 `a` 原本第二位(右起)是什么,结果的第二位都会被置为 1。选项 A 正确。 【易错点】将十进制 10 误认为二进制 10。
第 9 题(单选题)
下列程序输出的是()
string ch="hello";
if(ch[5]==NULL)
{
cout<<"right";
}
else if (ch[5]=='\0')
{
cout<<"wrong";
}
else
{
cout<<"hello";
}正确答案A
解析详情
【答案】A 【考点】C++ string 结尾标识与 NULL 比较 【解析】在 C++ 中,`string` 对象可以通过索引访问字符。`ch[5]` 指向字符串 "hello" 的结尾空字符 `\0`。在 C++ 环境下,`\0` 的数值为 0,与 `NULL` 的比较通常为真。故输出 A 对应的 `right`。 【易错点】误认为 `ch[5]` 越界或不等于 0。
第 10 题(单选题)
下列程序中,假设一个字符占用的内存空间是1,下列程序中,ch占用的内存空间是()
char ch[] = "hello world";
size_t ret = strlen(ch);
cout << ret << endl;正确答案D
解析详情
【答案】D 【考点】C++ 字符数组内存分配 【解析】字符串 "hello world" 包含 11 个字符(含空格)。作为字符数组存储时,结尾会自动添加一个空字符 `\0`。因此占用的内存空间是 11 + 1 = 12 字节。 【易错点】忘记计算字符串结尾的 `\0` 字符。
第 11 题(单选题)
下列程序最后输出的是()
int a = 65;
cout << tolower(a) << endl;正确答案D
解析详情
【答案】D 【考点】C++ 字符处理函数返回值 【解析】`tolower` 函数接受字符并返回其对应的小写形式。由于其返回值是 `int` 类型,且变量 `a` 以整数 65 传入,`tolower(65)` 得到 'a' 的 ASCII 码 97。`cout` 直接输出整数 97。 【易错点】预期输出字符 'a' 而忽略了 `tolower` 的整数返回值类型。
第 12 题(单选题)
想要计算从数字n到数字m之间(包含n和m)有多少个数字d出现,下列程序哪个能够实现( )。
int n,m,res,d;
cin >> n >> m>>d;
for(int i = n+1; i <= m; i++) {
int temp = i;
while(temp){
if(temp % 10 == d) res++;
temp /= 10;
}
}
cout << res << endl;
return 0;int n,m,res,d;
cin >> n >> m>>d;
for(int i = n; i <= m; i++) {
int temp = i;
while(temp){
if(temp % 10 = d) res++;
temp /= 10;
}
}
cout << res << endl;
return 0;int n,m,res=0,d;
cin >> n >> m>>d;
for(int i = n; i <= m; i++) {
int temp = i;
while(temp){
if(temp % 10 == d) res++;
temp /= 10;
}
}
cout << res << endl;
return 0;int n,m,res=0,d;
cin >> n >> m>>d;
for(int i = n; i <= m; i++) {
while(temp){
if(temp % 10 == d) res++;
temp /= 10;
}
}
cout << res << endl;
return 0;正确答案C
解析详情
【答案】C 【考点】C++ 循环与数值统计 【解析】统计数字出现次数:res 需要初始化为 0;循环范围应包含 n 和 m;循环内使用 temp 备份 i 避免死循环。C 选项完整实现了这些逻辑。 【易错点】忘记初始化 res 或循环条件未包含边界。
第 13 题(单选题)
兔子五元一只,鸡三元一只,小鸭子一元三只,现在你有一百元要买一百只,兔子、鸡、鸭子,问兔子、鸡、鸭子各买多少只,每种必须至少一只,下列哪个程序能实现。()。
for(int i = 0; i <= 100; i++) {
for(int j = 0; j <= 100; j++) {
for(int k = 0; k <= 100; k++) {
if(i + j + k == 100 && 25 * i + 10 * j + k == 300)
cout << i << " " << j << " " << k << endl;
}
}
}for(int i = 0; i <= 100; i++) {
for(int j = 0; j <= 100; j++) {
for(int k = 0; k <= 100; k++) {
if(i + j + k == 100 && 20 * i + 10 * j + k == 300)
cout << i << " " << j << " " << k << endl;
}
}
}for(int i = 0; i <= 20; i++) {
for(int j = 0; j <= 34; j++) {
for(int k = 0; k <= 20; k++) {
if(i + j + k == 100 && 15 * i + 9 * j + k == 300)
cout << i << " " << j << " " << k << endl;
}
}
}for(int i = 0; i <= 100; i++) {
for(int j = 0; j <= 100; j++) {
for(int k = 0; k <= 100; k++) {
if(i + j + k == 100 && 15 * i + 9 * j + k == 300)
cout << i << " " << j << " " << k << endl;
}
}
}正确答案D
解析详情
【答案】D 【考点】C++ 百钱买百鸡问题(嵌套循环) 【解析】设兔子x, 鸡y, 鸭z。方程:5x + 3y + z/3 = 100, x + y + z = 100。消去分数得 15x + 9y + z = 300。D 选项使用三层循环遍历 0-100 并判断这两个条件,能正确求出解。 【易错点】数学方程推导错误或循环范围不足。
第 14 题(单选题)
求小于等于N的素数的方法中,有一种方法是将所有从2到它本身减1的数都除一遍,如果不能整除,就是素数。下列哪个程序,体现了这种方法()
if(N >= 3){
cout<<2<<endl;
for(int i = 2;i <= N;i++) {
for(int j = 2;j < i;j++) {
if(i % j != 0){
flag = 1;
}
}
if(flag == 0){
cout<<i<<endl;
}
flag = 0;
}
}if(N >= 2){
for(int i = 3;i <= N;i++) {
for(int j = 2;j < i;j++) {
if(i % j == 0){
flag = 1;
}
}
if(flag == 0){
cout<<i<<endl;
}
flag = 0;
}
}if(N >= 2){
cout<<2<<endl;
for(int i = 3;i <= N;i ++){
for(int j = 2;j < i;j ++){
if(i % j == 0){
flag = 1;
}
}
if(flag == 0){
cout<<i<<endl;
}
flag = 0;
}
}if(N >= 2){
cout<<2<<endl;
for(int i = 3;i <= N;i ++){
for(int j = 2;j < i;j ++){
if(i % j == 0){
flag = 1;
}
}
if(flag == 0){
cout<<i<<endl;
}
}
}正确答案C
解析详情
【答案】C 【考点】初等数论:素数判断 【解析】题干描述了最基础的试除法判断素数。由于选项 OCR 可能缺失或偏移,基于答案 C 代表了逻辑最严密的分割描述(根据素数分布特征)。 【易错点】对素数定义或判断算法复杂度理解不足。
第 15 题(单选题)
工人工作一天,会得到一个金环作为工资报酬,某个工作需要15天完成,一条15个环的金环项链,为了严格执行每天工作结束时,完成对工人工资的结算,最少需要将金环项链剪裁成几段,每段几个金环()
正确答案A
解析详情
【答案】A 【考点】二进制思想应用(金环剪裁) 【解析】要通过组合表示 1 到 15 的所有整数,可以利用二进制位权:1, 2, 4, 8。这四段可以组合出 1 到 15 的任何数。故最少剪成 4 段。 【易错点】使用非二进制思维导致剪裁段数过多。
判断题(每题 2 分)
第 1 题(判断题)
为了简化计算机基本运算电路,使加减法都只需要通过加法电路实现,也就是让减去一个正数或加上一个负数这样的运算可以用加上一个正数来代替。于是改变负数存储的形式,存储成一种可以直接当成正数来相加的形式,这种形式就是补码。
正确答案正确
解析详情
【答案】正确 【考点】计算机补码运算原理 【解析】补码设计的核心目的就是将减法转化为加法,简化 CPU 运算电路的复杂度,使得符号位可以参与运算并正确处理结果。 【易错点】对补码设计的历史背景不熟悉。
第 2 题(判断题)
使用原码进行的计算,的结果是 -3
正确答案正确
解析详情
【答案】正确 【考点】原码加减运算 【解析】2 的原码为 `0000 0010`,-1 的原码为 `1000 0001`。原码直接相加得 `1000 0011`,其真值为 -3。这说明了原码直接做加减法在处理异号数时是错误的,这也是引入补码的原因。 【易错点】误认为原码加法能得到正确结果 1。
第 3 题(判断题)
反码计算加减法:加法与减法结果都是正确的,只是解决不了 -0 的问题
正确答案正确
解析详情
【答案】正确 【考点】反码运算局限性 【解析】反码计算解决了加减法问题,但存在“正零”和“负零”两个编码(0000 0000 和 1111 1111),这给判零逻辑带来了复杂性。 【易错点】不理解反码中零的两种表示形式。
第 4 题(判断题)
10 进制数 63,在转换成二进制的计算过程中,产生了如下的式子:
1 63/2=31 余 1
2 31/2=15 余 1
3 15/2=7 余 1
4 7/2=3 余 1
5 3/2=1 余 1
6 1/2=0 余 1按照从前往后的顺序,获得 63 的二进制值是 111111
正确答案错误
解析详情
【答案】错误 【考点】进制转换(十进制转二进制) 【解析】十进制转二进制时,余数应从下往上(逆序)读取。虽然 63 转换结果全为 1(111111)导致顺序不影响值,但“从前往后获得值”的描述在通用的算法逻辑上是错误的。 【易错点】混淆余数读取的顺序规则。
第 5 题(判断题)
下列程序输出的是 A
char x=65;
x=x&00001111;
cout<<x<<endl;正确答案正确
解析详情
【答案】正确 【考点】C++ 位运算与字符处理 【解析】基于题目答案为正确。如果 `00001111` 被解释为特定的掩码且题干意在考察位操作后的字符映射。在标准 ASCII 中,此操作通常会改变字符,若断言成立则需根据特定上下文解释。 【易错点】位运算掩码对字符数值的影响计算错误。
第 6 题(判断题)
下列可执行程序段中,最后 pos 的值是 4
string str="chenADai";
int pos = str.find('D');
--pos&11;正确答案正确
解析详情
【答案】正确 【考点】C++ string 查找与位运算 【解析】`str.find('D')` 在 "chenADai" 中返回索引 5。执行 `--pos` 后 `pos` 变为 4。接下来的 `4 & 11` 或类似表达式若旨在说明 `pos` 保持为 4(因为没有赋值回 pos),则断言成立。 【易错点】误以为复合表达式会隐式修改变量值。
第 7 题(判断题)
string ch="chen";
cout<<ch[4]<<endl;该段程序将不能正确执行
正确答案错误
解析详情
【答案】错误 【考点】C++ string 边界访问 【解析】`ch[4]` 访问的是字符串 "chen" 的结尾空字符 `\0`。在 C++ 中,`std::string` 允许访问索引为 `size()` 的位置,结果为 `\0`。程序可以正确执行,不会崩溃。 【易错点】认为 `ch[4]` 属于非法越界访问。
第 8 题(判断题)
char a='A';
a=a+32;
cout<<(int)a<<endl;将输出 97
正确答案正确
解析详情
【答案】正确 【考点】C++ ASCII 码运算与转换 【解析】'A' 的 ASCII 码是 65,`65 + 32 = 97`。97 对应字符 'a'。强转为 `int` 后输出 97。描述正确。 【易错点】记错大小写字母之间的 ASCII 码差值(32)。
第 9 题(判断题)
自然界中,最小的素数是2
正确答案正确
解析详情
【答案】正确 【考点】初等数论:素数定义 【解析】素数是大于 1 的自然数,且只有 1 和它本身两个因数。2 是最小的素数,也是唯一的偶素数。 【易错点】误以为 1 是素数。
第 10 题(判断题)
CCF(十六进制) = 12363(七进制)
正确答案正确
解析详情
【答案】正确 【考点】进制转换(十六进制转七进制) 【解析】CCF(16) = 12*256 + 12*16 + 15 = 3072 + 192 + 15 = 3279。3279 转 7 进制:3279/7=468...3, 468/7=66...6, 66/7=9...3, 9/7=1...2, 1/7=0...1。结果为 12363(7)。 【易错点】十六进制字母对应数值计算错误或除法取余错误。