视频讲解:GESP2025年6月三级C++真题讲解

一、单选题

第1题

解析:

答案A原码最小的整数是1111 1111(-127),若是补码,则最小的整数是-128,因为1000 0000是-128的补码

第2题

解析:

答案B,反码0000 0000或1111 1111都表达0

第3题

解析:

答案A

补码 1011  1011,减一变反码

反码 1011 1010,除了符号位,其他取反变原码

原码 1100 0101,转二进制-(1*2^{6}+1*2^{2}+1*2^{0})= -(64+4+1)= -69

第4题

解析:

答案A

符号位为0,原码和补码相同,即原码为0000 1010

第5题

解析:

答案A

转十进制

=1*2^{3} + 1*2^{2} + 0*2^{1} + 1*2^{0} + 1*2^{-1} + 0*2^{-2} + 1*2^{-3}

=8+4+0+1+0.5+0+0.125

=13.625

第6题

解析:

答案B

   0 1 1 1 1 1 1 1  (+127,符号位是第7位:0)
+  0 0 0 0 0 0 0 1  (+1,符号位是第7位:0)
-----------------------------
   1 0 0 0 0 0 0 0
最高位第7位的进位为0,次高位第6位的进位为1,进位不同,发生了“上位溢出”

第7题

解析:

答案A

八进制转十进制

3*8^{1}+5*8^{0}+6*8^{-1}

=3*8+5+1+6*0.125

=29.75

第8题

解析:

答案B,|运算,只要其中一个为1,结果为1

 1010
|1100
-------
 1110

第9题

解析:

答案A

第10题

解析:

答案D

A写法有误,应为:int* array = new int[5];

B没有这种写法

C写法有误,应为:int[] array = {1,2,3,4,5};

D正确

第11题

解析:

答案B

假设i:123

i/10将十位变成个位   123/10=12

i%10获取当前个位     12%10=2

即(i/10)%10

第12题

解析:

答案B

_______________  // 累加当前落下高度   即 distance += height;

height /= 2;  //跳跃高度减半
distance  += height; //累加 “减半跳跃高度”

第13题

解析:

答案D

GBK编码:中文占2字节,其他占1字节,也就是 (2中文)*2+(4字母)*1字节=8字节

UTF-8编码:中文占3字节,其他占1字节,也就是 (2中文)*3+(4字母)*1字节=10字节

第14题

解析:

答案C

s.rfind(“e”)表示在s字符串,反向寻找第一次出现字符串“e”的位置

G e s p   T e s t
0 1 2 3 4 5 6 7 8
反向寻找第一个e在位置6

第15题

解析:

答案C

4个英文字符+2个中文字符=6字符

二、判断题

第1题

解析:

答案×,比较的是内容,而不是地址

第2题

解析:

答案√,substr(起点,数量)

第3题

解析:

答案√×,浮点数不支持位运算  (>>,<<,^,&,|,~)

第4题

解析:

答案√,括号不影响字符串的判断

第5题

解析:

答案×,set内的元素不能通过地址修改,只能通过内置函数

#include <iostream>
#include <set>
using namespace std;

int main() {
    set<int> s = {1, 2, 3};
    
    // 1. 找到并删除旧元素
    int old_val = 2;
    s.erase(old_val);  // 删除元素 2
    
    // 2. 插入新元素
    int new_val = 10;
    s.insert(new_val);  // 插入元素 10
    
    // 遍历结果:1 3 10(保持有序)
    for (int num : s) {
        cout << num << " ";
    }
    
    return 0;
}

第6题

解析:

答案√

假设x:111(十进制7)
 111
&001
---------
 001
通过例子可知,只要第1位二进制数是1,代表是奇数

第7题

解析:

答案×,长度不足会获取到最后一位就停下来

string s="123456789";
cout<<s.substr(2,10);  //结果为:3456789

第8题

解析:

答案√,以前我遇到过一道题“完美立方”,其中就会出现进度丢失的问题

cout<<pow(6,3)<<endl;   //216
cout<<pow(3,3)<<endl;   //27
cout<<pow(4,3)<<endl;   //64
cout<<pow(5,3)<<endl;   //125
cout<<pow(3,3)+pow(4,3)+pow(5,3)<<endl;  //216
cout<<(pow(6,3)==pow(3,3)+pow(4,3)+pow(5,3));  //0

第9题

解析:

答案×,可以从1枚举到10,但是不能从1.0001... 枚举到 10.000..,会造成枚举范围模糊

第10题

解析:

答案√

#include <bits/stdc++.h>
using namespace std;
double f(){
	return 1;
}
int main(){
	cout<<f()/2;//0.5   证明f()返回浮点型
}

三、编程题

第1题 [GESP202506 三级] 奇偶校验

题目描述

数据在传输过程中可能出错,因此接收方收到数据后通常会校验传输的数据是否正确,奇偶校验是经典的校验方式之一。

给定 n 个非负整数 c1​,c2​,…,cn​ 代表所传输的数据,它们的校验码取决于这些整数在二进制下 1 的数量之和的奇偶性。如果这些整数在二进制下共有奇数个 1,那么校验码为 1;否则校验码为 0。你能求出这些整数的校验码吗?

输入格式

第一行,一个正整数 n,表示所传输的数据量。

第二行,n 个非负整数 c1​,c2​,…,cn​,表示所传输的数据。

输出格式

输出一行,两个整数,以一个空格分隔:

第一个整数表示 c1​,c2​,…,cn​ 在二进制下 1 的总数量;

第二个整数表示校验码(0 或 1)。

输入输出样例

输入 #1

4
71 69 83 80

输出 #1

13 1

输入 #2

6
1 2 4 8 16 32

输出 #2

6 0

说明/提示

对于所有测试点,保证 1≤n≤100,0≤ci​≤255。

答案

#include <bits/stdc++.h>
using namespace std;
//函数实现“二进制下1的数量” 
int tenTotwo(int x){
	int sum_1=0;//1的数量 
	//转换二进制 
	while(x){
		if(x%2==1){
			sum_1++;//+1
		}
		x/=2;
	}
	return sum_1;//返回1的数量 
}
int main(){
	//1)确定数量量n
	int n;
	cin>>n;
	//2)填充n个数据
	int ans=0; 
	for(int i=1;i<=n;i++){
		int temp;
		cin>>temp;
		//3)函数计算当前1数量
		ans+=tenTotwo(temp); 
	} 
	//4)输出1的数量,数量是否为奇数
	cout<<ans<<" "<<(ans%2==1); 
}

第2题 [GESP202506 三级] 分糖果

题目描述

有 n 位小朋友排成一队等待老师分糖果。第 i 位小朋友想要至少 ai​ 颗糖果,并且分给他的糖果数量必须比分给前一位小朋友的糖果数量更多,不然他就会不开心。

老师想知道至少需要准备多少颗糖果才能让所有小朋友都开心。你能帮帮老师吗?

输入格式

第一行,一个正整数 n,表示小朋友的人数。

第二行,n 个正整数 a1​,a2​,…,an​,依次表示每位小朋友至少需要的糖果数量。

输出格式

输出一行,一个整数,表示最少需要准备的糖果数量。

输入输出样例

输入 #1

4
1 4 3 3

输出 #1

16

输入 #2

15
314 15926 53589793 238462643 383279502 8 8 4 1 9 7 1 6 9 3

输出 #2

4508143253

说明/提示

对于所有测试点,保证 1≤n≤1000,1≤ai​≤10^{9}

答案

#include <bits/stdc++.h>
using namespace std;
int main(){
	//1)确定小朋友数量n
	int n;
	cin>>n;
	//2)填充每个小朋友需求
	long long after_max=0,ans=0;
	for(int i=1;i<=n;i++){
		long long temp;
		cin>>temp;
		//3)计算真正的需求
		if(temp<after_max) temp=after_max+1;
		after_max=temp;//更新最大值 
		//4)累加“真需求”
		ans+=temp;
	}
	//5)输出结果
	cout<<ans; 
}

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐