2024年12月真题
一、单选题(每题2分,共30分)
正确答案:B
解析:考察数据编码:原码、反码、补码。左边首位是符号位,0表示正数,1表示负数。
原码:符号位+该数绝对值的二进制形式。
正数:原码、反码、补码 相同
负数:除符号位之外,原码 按位取反得 反码,反码 加1得 补码。 补码求原码步骤相同:按位取反再加1。
1:首位为1,是负数,原码直接求对应十进制数为-3
2:首位为1,是负数,补码要转成原码为:[11111101]原,对应十进制数-125。
正确答案:D
解析:原码求反码:除符号位之外,其余按位取反。D没考虑符号位。
正确答案:A
解析:
方法1:
16进制转成10进制:按位权展开后求和: 11 ∗ 1 6 4 + 2 ∗ 1 6 3 + 2 ∗ 16 + 5 = 729125 11*16^{4} +2*16^{3}+2*16+5=729125 11∗164+2∗163+2∗16+5=729125
10进制转成8进制:整数部分:除8取余,直到商为0,逆序输出余数:2620045
方法2:
16进制转成2进制:1位拆4位:[1011 0010 0000 0010 0101]2
2进制转成8进制:从右往左,3位合1位,不足3位前补0:[010 110 010 000 000 100 101]2 = [2620045]8
正确答案:A
解析:考察十进制转成2进制
整数部分:除2取余,直到商为0,逆序输出余数
小数部分:乘2取整,直到积为1,顺序输出整数部分
正确答案:D
解析:
&& (逻辑与),||(逻辑或) 的运算对象和运算结果都是布尔类型,数据都有真假性,运算对象不是布尔类型时要转成对应的布尔值。&& (逻辑与)运算符两边都为真结果为真,两边有一假结果为假。||(逻辑或) 运算符两边有一真结果为真,两边都为假结果为假。
& (按位与),|(按位或) 的运算对象是数的二进制形式,运算对象不是二进制时要先转成二进制。运算结果可以写成非二进制形式,一般要标注出来。& (按位与)两个1结果为1,有一个为0结果为0。|(按位或) 有1个为1结果为1,两个都为0结果为0。
A:5为真,3为真,5&&3 结果为真,值为1。
C:5为真,3为真,5||3 结果为真,值为1。
B:5的二进制:[0101]2,3的二进制:[0011]2,5|3的二进制为[0111]2,对应十进制为7
D:5的二进制:[0101]2,3的二进制:[0011]2,5&3的二进制为[0001]2,对应十进制为1
正确答案:B
解析:考察数据编码:原码、反码、补码,位运算符。
位运算的运算对象是数的二进制形式,且对于有符号数,运算对象是数的补码形式。
正数右移,前补0,负数右移,前补1。
1111 1101>>1 结果为:[1111 1110]补=[1000 0010]原,十进制数-2。
正确答案:C
解析:replace(pos, len, str):将从pos开始,长为len的一段字符串替换成str。本题将"234@@“替换成"12345”,结果是C
正确答案:A
解析:|(按位或) 有1个为1结果为1,两个都为0结果为0。
1 0 10 10_{10} 1010 = 0000101 0 2 0000 1010_2 000010102
a|10 可以将a的倒数第二位,倒数第四位 为1,其余位不做改变。
正确答案:A
解析:字符串下标从0开始,可见字符下标范围:0~长度-1。这里ch[5]是字符串的结尾标识字符,即看不见的’\0’,'\0’的ASCII是0,和NULL的ASCII相同,因此第2行的关系表达式成立。输出right
正确答案:D
解析:使用字符数组存储字符串时,要把结尾标识字符’\0’考虑在内,因此占用内存空间是12*1。
正确答案:D
解析:tolower函数的参数类型和返回值类型都是int类型,功能:参数为大写字母ASCII码返回小写字母ASCII码,否则返回原参数,函数声明:int tolower(int c)。
65是大写字母’A’的ASCII码,转成小写’a’的ASCII为97。输出97
补:int toupper(int c):功能:参数为小写字母ASCII码返回大写字母ASCII码,否则返回原参数
正确答案:C
解析:考察数位分离
A选项错误,第3行 没有考虑n
B选项错误,第6行,应该使用判等运算符==,错误使用了赋值运算符=
D选项错误,第4行,temp没有定义和赋值,无法使用
正确答案:D
解析:百元买百鸡问题,题目要求每种必须至少一只,所有没有正确答案。
抛开每种必须至少一只的要求,答案选D。
用 i 表示买的兔子数量,j 表示买的鸡的数量,k表示小鸭子的数量。
百元买百只动物:i+j+k == 100 并且 5*i+3*j+k/3==100 并且 k%3==0。
5*i+3*j+k/3==100 并且 k%3==0 可以替换成 15*i+9*j+k==300
A、B选项,第4行判断条件错误
兔子5元一只,100元最多买20只兔子;鸡三元一只,100元最多买33只鸡;买百只动物,最多买33只小鸭子。
C选项 第2、3行循环条件错误。
正确代码如下:
可做进一步优化:
正确答案:C
解析:
A选项错误,第1、2行已经考虑过素数2了,第3行循环条件应该从3开始。
B选项错误,素数2没有单独考虑,第2行循环条件应该从2开始。
D选项错误,每次判断 i 是否为素数,都应该将flag置为0,D缺乏有关代码。
正确答案:A
解析:为了能够每天都准确结算工资,我们要通过合理分割金环项链,利用已有的金环组合来凑出从 1 到 15 的不同数量,以此来对应每一天的报酬支付情况。
具体分割方式及推理过程:
我们考虑将 15 个环的金环项链剪成 1 个环、2 个环、4 个环和 8 个环,总共 4 段。
第一天:直接给工人 1 个环的那段,就可以结算第一天的工资。
第二天:把 2 个环的那段给工人,同时拿回第一天给出去的 1 个环,这样就可以结算第二天的工资。
第三天:再把第一天拿回的 1 个环给工人,此时工人手中有 2 + 1 = 3 个环,就完成了第三天的工资结算。
第四天:给工人 4 个环的那段,同时拿回之前给出去的 1 个环和 2 个环,此时刚好结算第四天的工资。
第五天:把之前拿回的 1 个环再给工人,工人手中有 4 + 1 = 5 个环,满足第五天的工资结算。
第六天:把之前拿回的 2 个环给工人,工人手中有 4 + 2 = 6 个环,完成第六天工资结算。
第七天:把之前拿回的 1 个环和 2 个环都给工人,工人手中有 4 + 2 + 1 = 7 个环,对应第七天工资。
第八天:给工人 8 个环的那段,同时拿回之前给出去的 1 个环、2 个环和 4 个环,刚好结算第八天工资。
第九天:把之前拿回的 1 个环给工人,工人手中有 8 + 1 = 9 个环,完成第九天工资结算。
第十天:把之前拿回的 2 个环给工人,工人手中有 8 + 2 = 10 个环,对应第十天工资。
第十一天:把之前拿回的 1 个环和 2 个环都给工人,工人手中有 8 + 2 + 1 = 11 个环,用于结算第十一天工资。
第十二天:把之前拿回的 4 个环给工人,工人手中有 8 + 4 = 12 个环,满足第十二天工资结算。
第十三天:把之前拿回的 1 个环和 4 个环给工人,工人手中有 8 + 4 + 1 = 13 个环,对应第十三天工资。
第十四天:把之前拿回的 2 个环和 4 个环给工人,工人手中有 8 + 4 + 2 = 14 个环,完成第十四天工资结算。
第十五天:把之前拿回的 1 个环、2 个环和 4 个环都给工人,工人手中有 8 + 4 + 2 + 1 = 15 个环,刚好结算完整个 15 天的工资。
所以最少需要将金环项链剪裁成 4 段,每段分别为 1 个环、2 个环、4 个环、8 个环。
二、判断题(每题2分,共20分)
正确答案:正确,正确,正确
解析:
第1题:正确,设计补码的原因
第2题:正确,2原码:[0000 0010]原,-1原码:[1000 0001]原。用原码做加法结果为[1000 0011],对应十进制-3。
第3题:正确,因为解决不了-0的问题,进一步设计出了补码。
正确答案:错误
解析:十进制转二进制。除2取余数,直到商为0,余数逆序输出。
正确答案:正确
解析:[65]10 = [0000 0100 0001]2。
&(按位与)同为1结果为1,有一个是0结果为0。
如果没有标识,0b、0B开头的数为二进制,0开头的数为八进制,0x、0X开头为十六进制。第二行的00001111是一个八进制数。[00001111]8=[0010 0100 1001]2
第2行执行完,x的值为[0000 0100 0001]2=[65]10,ASCII值65所对应的字符为’A’。输出正确。
正确答案:正确
解析:find() 函数,在字符串中查找字符或者字符串,找到返回第一次出现的下标,找不到返回-1。很显然可以在str找到字符’D’,下标为5。第3行–pos,–是自减运算符,前减减,先自减1,再使用。自减1之后pos的值为4。正确。
正确答案:错误
解析:下标4是字符串结尾标识字符’\0’,程序可以正确执行。
正确答案:正确
解析:字符参与运算,字符会被转成对应的ASCII码参与运算,‘A’的ASCII码是65,执行第2行,a+32值为97,将97赋值给字符类型变量,97对应字符为’a’,此时字符类型变量a中存储的内容为字符’a’,执行第3行,强制类型转换,把字符类型转成int类型输出,输出字符对应的ASCII码:97。
正确答案:正确,正确
解析:
第9题:2是最小的素数。补充:4是最小的合数。
第10题:考察进制转换。先把十六进制转成十进制,再把十进制转成7进制。[CCF]16=[3279]10=[12363]7
三、编程题(每题25分,共50分)
#include<bits/stdc++.h> //万能头文件
using namespace std;
const int N=1e5;
int arr[N]; //数组较大,定义成全局数组
int main() {int n, k, maxIdx=0, minIdx=0; //数组求最值可用下标标识 cin>>n>>k;for(int i=0; i<n; i++){cin>>arr[i];if(arr[i] > arr[maxIdx]) maxIdx=i;if(arr[i] < arr[minIdx]) minIdx=i;} for(int i=0; i<n; i++){if(arr[i]<k) arr[i]=arr[minIdx];if(arr[i]>k) arr[i]=arr[maxIdx];cout<<arr[i]<<" ";}return 0;
}
洛谷有类似题目:P5730 【深基5.例10】显示屏
#include<bits/stdc++.h> //万能头文件
using namespace std;
int main() {//定义长度为5的字符串数组存储最后的输出结果 string res[5]={}; //对于输入的正整数,从前往后进行对应形式的输出,可以方便操作,考虑使用字符串存储输入的数据 string n;cin>>n;for(int i=0; i<n.size(); i++){switch(n[i]){case '0':res[0]+=".....";res[1]+=".***.";res[2]+=".***.";res[3]+=".***.";res[4]+="....."; break;case '1':res[0]+="****.";res[1]+="****.";res[2]+="****.";res[3]+="****.";res[4]+="****."; break;case '2':res[0]+=".....";res[1]+="****.";res[2]+=".....";res[3]+=".****";res[4]+="....."; break;case '3':res[0]+=".....";res[1]+="****.";res[2]+=".....";res[3]+="****.";res[4]+="....."; break;}} for(int i=0; i<5; i++) cout<<res[i]<<endl;return 0;
}