2024年12月GESPC++三级真题解析(含视频)
视频讲解:GESP2024年12月三级C++真题讲解
一、单选题
第1题
解析:
答案B,
1、[1000 0011]原 转二进制
符号位是1,所以是负数
-(2^1+2^0)=-(2+1)=-3
2、[1000 0011]补
转反码变 1000 0100
转原码变 1111 1011
转二进制 -(2^6+2^5+2^4+2^3+2^1+2^0)
= -(64+32+16+8+2+1)
=-125
第2题
解析:
答案D,
负数反码,符号位不变
第3题
解析:
答案A,
1、逐位转为二进制
B | 2 | 0 | 2 | 5 |
1011 | 0010 | 0000 | 0010 | 0101 |
2、以3个隔开,再转为 八进制
10 | 110 | 010 | 000 | 000 | 100 | 101 |
2 | 6 | 2 | 0 | 0 | 4 | 5 |
第4题
解析:
答案A,
1、解决整数 625
625%2=312...1
312%2=156...0
156%2=78...0
78%2=39...0
39%2=19...1
19%2=9...1
9%2=4...1
4%2=2...0
2%2=1...0
1%2=0...1
整数二进制为 10 0111 0001
2、解决浮点数 0.625
0.625*2=1.250 整数为1
0.250*2=0.5 整数为0
0.5*2=1 整数为1
浮点数二进制为 101
3、合并结果
10 0111 0001.101
第5题
解析:
答案D,
第6题
解析:
答案B,
补码 1111 1101
右移1位,符号位不变 1111 1110
-1得反码 1111 1101
取反得原码 1000 0010
转为十进制,即-2
第7题
解析:
答案C,
字符:1 2 3 4 @ @ c h e n a d a i
下标:0 1 2 3 4 5 6 7 8 9 10 11 12 13replace(1,5,str)
从下标1开始,替换5个字符,为str变量即下面替换 成“12345”
字符:2 3 4 @ @
下标:1 2 3 4 5字符串最终为:“112345@@chenadai”
第8题
解析:
答案A,
a变量未知
运算过程为下0010
|????
-----------??1?从右往左第二位 ,绝对是1
第9题
解析:
答案A,
ch[5]存储"\0"
在c++中,0 、‘\0’、NULL、false 都等价
所以 if(ch[5]==NULL) 条件符合,输出“right”
第10题
解析:
答案D,代码输出的是11,但是题目问的是 "ch占用空间" ,char数组会在末尾添加‘\0’,标记为结束,所以占用空间为11+1=12
第11题
解析:
答案D,
ASCII 65对应 ‘A’
tolower转小写,变为 ‘a’
因为tolower()函数 返回的是 int类型,所以输出 ‘a’对应 ASCII 97
第12题
解析:
答案C,
选项A:i=n+1,不符合“包含n”
选项B:res 没有初始化为0
选项D:temp没有拷贝i
第13题
解析:
答案D,
A选项:条件(25*i + 20*j +k ==300),换算单位不统一
B选项:条件(20*i + 10*j +k ==300),换算单位不统一
C选项:循环(int k=0;k<=20;k++)有误,k表达的是鸭子的数量,鸭子数量最多不止20只
D选项:其实也有问题,无法满足 “每种必须一只” ,但是官方答案给了D,我们只能某某接受
第14题
解析:
答案C,
A选项:if(i % j != 0){ flag=1 } 错误,flag为1表达的应该是“ i不是素数 ”
B选项:没有解决2这个素数
D选项:flag没有重置
第15题
解析:
答案A,
假设4段,分别1、2、4、8
天数 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
工人 | 1 | 2 | 1,2 | 4 | 1,4 | 2,4 | 1,2,4 | 8 | 1,8 | 2,8 | 1,2,8 | 4,8 | 1,4,8 | 2,4,8 | 1,2,4,8 |
老板 | 2,4,8 | 1,4,8 | 4,8 | 1,2,8 | 2,8 | 1,8 | 8 | 1,2,4 | 2,4 | 1,4 | 4 | 1,2 | 2 | 1 | 无 |
二、判断题
第1题
解析:
答案√,补码就是把负数用另一种方式存储,实现加法模拟减法
第2题
解析:
答案√,
2原码:0000 0010
-1原码:1000 00010000 0010
+1000 0001
----------------1000 0011
即-3
第3题
解析:
答案√,
第4题
解析:
答案×,结果正确,表述错误,应该是从后往前
第5题
解析:
答案√,
0开头表示八进制
即1111(8)全部转为二进制
65的二进制 0100 0001
1111(8)
=512 + 64 + 8 +1
二进制为:0010 0100 1001做&运算0000 0100 0001
& 0010 0100 1001
--------------------0000 0100 0001
还是65,即‘A’
第6题
解析:
答案√,
find('D')的下标
字符:c h e n A D a i
下标:0 1 2 3 4 5 6 7
所以pos = 5--pos
pos变为4pos&11不影响 pos的值
第7题
解析:
答案×,ch[4]是‘\0’为终止符,可以输出,但是不可见
第8题
解析:
答案√,‘A’ 的 ascii值为65,65+32=97
第9题
解析:
答案√,数学定义中,2就是最小的素数
第10题
解析:
答案√,
CCF(16)
转十进制
C*16^2 + C*16^1 + F*16^0
=12*16*16+12*16+15
=3072+192+15
=327912363(7)
转十进制
1*7^4 + 2*7^3 + 3*7^2 + 6*7^1 + 3*7^0
=7*7*7*7 + 2*7*7*7 + 3*7*7 + 6*7 + 3*1
=49*49 + 14*49 + 3*49 +42+ 3
=49*( 49+14+3 ) + 45
=49*66 + 45
=3234+45
=3279
三、编程题
第1题 [GESP202412 三级] 数字替换
题目描述
小杨有一个包含 n 个数字的序列 A,即 A=[a1,a2,…,an],他想将其中大于 k 的数字都替换为序列的最大值,将其中小于 k 的数字都替换为序列的最小值,请你帮他计算出替换后的序列。
输入格式
第一行包含两个正整数 n,k,含义如题面所示。
第二行包含 n 个数字,代表序列 A。
输出格式
输出 n 个整数,代表替换后的结果。
输入输出样例
输入 #1
5 0
-2 -1 0 1 2
输出 #1
-2 -2 0 2 2
说明/提示
对于全部数据,保证有 1≤n≤,∣k∣,∣ai∣≤
。
答案
#include<bits/stdc++.h>
using namespace std;
int main(){//1)确定数量n 条件kint n,k;cin>>n>>k;//2)循环填充n个数int arr[100010]={};int maxx=INT_MIN,minn=INT_MAX;for(int i=1;i<=n;i++){cin>>arr[i];//3)比较找出最大 最小if(arr[i]>maxx) maxx=arr[i];if(arr[i]<minn) minn=arr[i];}//4)输出修改后的数组for(int i=1;i<=n;i++){if(arr[i]==k) cout<<k<<" ";else if(arr[i]<k) cout<<minn<<" ";else cout<<maxx<<" ";}
}
第2题 [GESP202412 三级] 打印数字
题目描述
小杨为数字 0,1,2 和 3 设计了一款表示形式,每个数字占用了 5×5 的网格。数字 0,1,2 和 3 的表示形式如下:
..... ****. ..... .....
.***. ****. ****. ****.
.***. ****. ..... .....
.***. ****. .**** ****.
..... ****. ..... .....
小杨想请你将给定的数字 n 转换为对应的表示形式。
输入格式
第一行包含一个非负整数代表 n。
输出格式
输出对应的表示形式。
输入输出样例
输入 #1
12230
输出 #1
****.....................
****.****.****.****..***.
****.................***.
****..****.********..***.
****.....................
说明/提示
对于全部数据,保证有 0≤n≤,且 n 仅由数字 0,1,2,3 组成。
答案
#include<bits/stdc++.h>
using namespace std;
string ans1,ans2,ans3,ans4,ans5;
void f(char x){if(x=='0'){ans1+=".....";ans2+=".***.";ans3+=".***.";ans4+=".***.";ans5+=".....";}else if(x=='1'){ans1+="****.";ans2+="****.";ans3+="****.";ans4+="****.";ans5+="****.";}else if(x=='2'){ans1+=".....";ans2+="****.";ans3+=".....";ans4+=".****";ans5+=".....";}else{ans1+=".....";ans2+="****.";ans3+=".....";ans4+="****.";ans5+=".....";}
}
int main(){//1)确定数字(字符串)string s;cin>>s;//2)遍历字符串(从前往后)for(int i=0;i<s.size();i++){//3)拼接对应网格f(s[i]);}//4)输出结果cout<<ans1<<endl; cout<<ans2<<endl; cout<<ans3<<endl; cout<<ans4<<endl; cout<<ans5<<endl;
}