2024年9月GESPC++三级真题解析(含视频)
视频讲解:GESP2024年9月三级C++真题讲解
一、单选题
第1题
解析:
答案B,会有精度缺失
double a=0.9;
double b=1.0;
//输出为0.09999999999999997780
cout<<fixed<<setprecision(20)<<b-a<<endl;
第2题
解析:
答案C,
A选项:负数的原码、反码、补码形式就不一样
B选项:符号位+ 绝对值(真值)才对
D选项:-1的反码 应该是 [1111 1110]
第3题
解析:
答案A,
第1步:
3703(8进制) 转2进制:
3 7 0 3
011 111 000 011
即二进制为:011111000011
第2步:
转16进制
0111 1100 0011
7 C 3
第4题
解析:
答案D,
0.8125*2=1.625 取整数1
0.625*2=1.250 取整数1
0.250*2=0.5 取整数0
0.5*2=1.0 取整数1
二进制位0.1101
第5题
解析:
答案C,
C选项:
23(十进制)=10111(二进制)
10(十进制)=1010(二进制)
进行 | 运算10111
| 1010
-------11111
即31(十进制)
第6题
解析:
答案B,
2>>2为:10(二进制)右1位,结果为0
1>>1为:1(二进制)右1位,结果为0
所以 (2>>2)==(1>>1)
第7题
解析:
答案C,
a^=b; 找出二进制差异
b^=a;根据差异计算出原a的值
a^=b; 根据差异计算出原b的值
第8题
解析:
答案C,
~1 对应二进制 1111 1110
最低位做“&”运算 必为0
第9题
解析:
答案A,
第10题
解析:
答案D,
1)计算result
1.1)a、b转为二进制
a的123,转二进制为:0111 1011
b的1,转二进制为:0000 0001
1.2)a&b运算0111 1011
& 0000 0001
---------------0000 0001
所以result输出为1
2)计算result2
2.1)a2、b2转为二进制
a2的-123,转二进制为:0111 1011
b2的1,转二进制为:1111 1111,1111 1111,11111 1111,1111 1111 因为unsigned,以补码形式存储
2.2)a2&b2运算(只算前8位,后面都为0不用管)0111 1011
& 1111 1111
---------------0111 1011
所以result2输出为-123
第11题
解析:
答案D,
1)计算什么时候到达100,发现累加到13,为91,还需+9才能到100
1+2+3+4+5+6+7+8+9+10+11+12+13+9=100
2)计算总浇水次数
1*1+2*2+3*3+4*4+5*5+6*6+7*7+8*8+9*9*+11*11+12*12+13*13+9*14
=1+4+9+16+25+36+49+64+81+121+144+169+126
=945
第12题
解析:
答案C,
A选项:a数组内没存放数据,且i为10时,a[10]越界
B选项:i为10时,a[10]越界
D选项:i为10时,a[10]越界
第13题
解析:
答案D,a[10]没有存放数据,数据是随机的
第14题
解析:
答案C,
枚举解决
假设A是小偷,和B说C是小偷冲突
假设B是小偷,和C说D是小偷冲突
假设C是小偷,没有冲突
假设D是小偷,因D小偷,所以是D说假话,即D说C是小偷,有冲突
第15题
解析:
答案B,
字符:H e l l o , C H A D
下标:0 1 2 3 4 5 6 7 8 9字符‘A’下标为8
二、判断题
第1题
解析:
答案√,
0000 0001
+ 1000 0001
----------------1000 0010
对应十进制就是-2
第2题
解析:
答案√,
1的补码:0000 0001
~1的结果:1111 1110
补码:1111 1110 进行-1,转换反码
反码:1111 1101 进行取反,转换原码
原码:1000 0010 就是-2
第3题
解析:
答案√,
1的补码:0000 0001
~1的结果:1111 1110
第4题
解析:
答案√,
Y的低4位都为1,与X进行&运算,只要X低4为有1,就会被获取到
第5题
解析:
答案×,
char x=65; //x为字符 ‘A’
x++;//x为字符 ‘B’
cout<<x++<<endl; //先输出字符‘B’,x再进行++
第6题
解析:
答案√,
字符:C H A D a i
下标:0 1 2 3 4 5
‘D’的下标为4
size_t的意思只能保存0或正整数,即长度
第7题
解析:
答案×,
a[10]={1} 是给a[0]赋值为1
a[1]里面没有赋值
第8题
解析:
答案√,
ASCII 65对应的 就是 字符‘A’
第9题
解析:
答案√,
A(16)=1010(2)
B(16)=1011(2)
第10题
解析:
答案×,
def 转十进制
=d*16^2 + e*16^1 + f*16^0
=13*16*16 + 14*16 + 15*1
=3328 + 224 + 15
=3567103231 转五进制
=1*5^5 + 0*5^4 + 3*5^3 + 2*5^2 + 3*5^1 + 1*5^0
=5*5*5*5*5 + 0 + 3*5*5*5 + 2*5*5 + 3*5 + 1
=3125 + 375 + 50 + 15 +1
=3566
三、编程题
第1题 [GESP202409 三级] 平衡序列
题目描述
小杨有一个包含 n 个正整数的序列 a。他认为一个序列是平衡的当且仅当存在一个正整数 i(1≤i<n)使得序列第 1 到第 i 个数字的总和等于第 i+1 到第 n 个数字的总和。
小杨想请你判断序列 a 是否是平衡的。
输入格式
本题单个测试点内包含多组测试数据。第一行是一个正整数 t,表示测试用例组数。
接下来是 t 组测试用例。对每组测试用例,一共两行。
第一行包含一个正整数 n,表示序列长度。
第二行包含 n 个正整数,代表序列 a。
输出格式
对每组测试用例输出一行一个字符串。如果 a 是平衡的,输出 Yes,否则输出 No。
输入输出样例
输入 #1
3
3
1 2 3
4
2 3 1 4
5
1 2 3 4 5
输出 #1
Yes
Yes
No
说明/提示
样例 1 解释
- 对第一组测试用例,令 i=2,有 1+2=3,因此序列是平衡的。
- 对第二组测试用例,令 i=2,有 2+3=1+4,因此序列是平衡的。
- 对第三组测试用例,不存在满足要求的 i。
数据规模与约定
对全部的测试数据,保证 1≤t≤100,1≤n,ai≤10000。
答案
#include<bits/stdc++.h>
using namespace std;
int main(){//1)确定多少组数据tint t;cin>>t; //2)填充t组数据for(int i=1;i<=t;i++){//2.1)确定长度nint n;cin>>n;//2.2)填充每个aint prefix_sum[10010]={};map<int,bool> flag; for(int j=1;j<=n;j++){int a;cin>>a;//3)填充同时,计算前缀和prefix_sum[j]=prefix_sum[j-1]+a;//4.1)标记当前 “ 前缀和”出现flag[ prefix_sum[j] ] =true;}//4)根据“前缀和”判断(众多“前缀和”中,有没有一半)if( prefix_sum[n]%2==0 && flag[ prefix_sum[n]/2 ] ){cout<<"Yes"<<endl;}else{cout<<"No"<<endl;}}
}
第2题 [GESP202409 三级] 回文拼接
题目描述
一个字符串是回文串,当且仅当该字符串从前往后读和从后往前读是一样的,例如,aabaa 和 ccddcc都是回文串,但 abcd 不是。
小杨有 n 个仅包含小写字母的字符串,他想请你编写程序判断每个字符串是否由两个长度至少为 2 的回文串前后拼接而成。
输入格式
第一行包含一个正整数 n,代表字符串数量。
接下来 n 行,每行一个仅包含小写字母的字符串。
输出格式
对于每个字符串输出一行,如果该字符串由两个长度至少为 2 的回文串前后拼接而成则输出 Yes,否则输出 No。
输入输出样例
输入 #1
4
abcd
aabbb
aaac
abcdd
输出 #1
No
Yes
No
No
说明/提示
样例 1 解释
对于第 1,3,4 个字符串,都不是由两个长度至少为 2 的回文串前后拼接而成。 第 2 个字符串由回文串 aa 和 bbb 前后拼接而成,并且两个回文串长度都至少为 2。
数据规模与约定
对全部的测试数据,保证 1≤n≤10,且每个字符串的长度均不超过 100。
答案
#include<bits/stdc++.h>
using namespace std;
bool isHui(string s){string r_s="";int len=s.size();for(int i=len-1;i>=0;i--){r_s+=s[i];}return r_s==s;
}
int main(){//1)确定字符串数量nint n;cin>>n;//2)填充每个字符串for(int i=1;i<=n;i++){string s;cin>>s;//3)划分所有情况bool flag=false;//假设不行 int len= s.size();for(int j=2;j<=len-2;j++){string left=s.substr(0,j);string right=s.substr(j);//4)判断 左右两边是否为 “回文”if( isHui(left) && isHui(right) ){flag=true;break; }}//5)根据flag判断if(flag) cout<<"Yes"<<endl;else cout<<"No"<<endl;}
}