视频讲解:GESP2023年12月三级C++真题讲解
一、单选题
第1题
解析:
答案C,char数组是保存单个字符
第2题
解析:
答案D,统一转二进制
A选项:221(十进制)= 1101 1101(二进制)
B选项:335(八进制)= 1101 1101(二进制)
C选项:dd(十六进制)= 1101 1101(二进制)
D选项:5d(十六进制)= 0101 1101(二进制)
第3题
解析:
答案C,起点下标是0
第4题
解析:
答案C,罗列所有可能
i循环为:1,2,3,4,5,6
j循环为:每次循环为1,2,3,4
(i=2,j=1)(i=4,j=2)(i=6,j=3)(i=5,j=2)是2倍关系
第5题
解析:
答案C,str.length()是str字符串的长度,即为4
i循环0 , 1 ,2,3,4;循环5次,即temp=5
第6题
解析:
答案A,x为str字符串的长度
第7题
解析:
答案A,
字符:c h e n '\0'
下标:0 1 2 3 4
下标5越界了,c/c++没有处理这种异常,输出的内容是未知的
第8题
解析:
答案C,字符数组使用{}初始化,初始化的字符是空格
第9题
解析:
答案C,统一转为ASCII值
A选项:'o' = 111
B选项:'a' + 14 = 111
C选项:115
D选项:111
第10题
解析:
答案C,32为二进制,除了最高位的符号位,不能和表达真值,所以为-(2^31-1) 至 2^31-1,
但是补码形式,可表达-2^31
所以 -2^31 至 2^31-1
第11题
解析:
答案A,0 和 15都满足条件
第12题
解析:
答案B,
a/b*1.0
=3/2*1.0
=1*1.0
=1
第13题
解析:
答案A,代码加注释即可
for(int i=0;i<=strSrc.length();i++)
{
//数字字符进行拼接
if(strSrc[i]>='0'&&strSrc[i]<='9')
{
tel=tel+strSrc[i];
}
else if(tel!="")//不是数字字符,且tel有内容
{
cout<<tel<<endl;//输出拼接好的号码
tel="";//清空当前号码,为下一次拼接做准备
}
}
第14题
解析:
答案C,只要有油,油量表有没有都无所谓
第15题
解析:
答案B,现代计算机就是基于 “冯诺依曼” 结构
二、判断题
第1题
解析:
答案√,int中的数字进行布尔运算,除了0是false,其他都是true,也就是1
5&&2
=1&&1
=1
第2题
解析:
答案√,cin字符串时,空格会被视为结束,所以空格后面的内容都不接收
第3题
解析:
答案√,int中的数字进行布尔运算,除了0是false,其他都是true,也就是1
5||2
=1||1
=1
第4题
解析:
答案√,replact(起点,数量,替换字符串)
replace(0,1,"C")意思就是从下标0开始,替换1个字符,用 "C" 替换
第5题
解析:
答案×,只有0、5下标满足条件,但是list[0]=1,list[5]=6
第6题
解析:
答案×,输出数组名,会输出数组的地址
第7题
解析:
答案√,0下标存储的就是1
第8题
解析:
答案√,
数组值:1 2 3 4 5 6 7 8 9 10
下 标:0 1 2 3 4 5 6 7 8 9
i循环为0 2 4 6 8,对应的数组值是1 3 5 7 9
第9题
解析:
答案×,Devc++是软件,Windows、MacOS、Linux、鸿蒙等才是操作系统
第10题
解析:
答案√,
for(int i=1;i<=5;i++){
}
int i=1;
while(i<=5){
i++;
}
三、编程题
第1题 [GESP202312 三级] 小猫分鱼
题目描述
海滩上有一堆鱼,N 只小猫来分。第一只小猫把这堆鱼平均分为 N 份,多了 i<N 个,这只小猫把多的 i 个扔入海中,拿走了一份。第二只小猫接着把剩下的鱼平均分成 N 份,又多了 i 个,小猫同样把多的 i 个扔入海中,拿走了一份。第三、第四、……,第 N 只小猫仍是最终剩下的鱼分成 N 份,扔掉多了的 i 个,并拿走一份。
编写程序,输入小猫的数量 N 以及每次扔到海里的鱼的数量 i,输出海滩上最少的鱼数,使得每只小猫都可吃到鱼。
例如:两只小猫来分鱼 N=2,每次扔掉鱼的数量为 i=1,为了每只小猫都可吃到鱼,可令第二只小猫需要拿走 1 条鱼,则此时待分配的有 3 条鱼。第一只小猫待分配的鱼有 3×2+1=7 条。
输入格式
总共 2 行。第一行一个整数 N,第二行一个整数 i。
保证 0<N<10;i<N 。
输出格式
一行一个整数,表示满足要求的海滩上最少的鱼数。
输入输出样例
输入 #1
2
1
输出 #1
7
输入 #2
3
1
输出 #2
25
说明/提示
样例解释 2
三只小猫来分鱼 N=3,每次扔掉鱼的数量为 i=1,为了每只小猫都可吃到鱼,可令第三只小猫需要拿走 3 条鱼(拿走 1 条和 2 条不满足要求),则此时待分配的有 10 条鱼。第二只小猫待分配的鱼有 10×3/2+1=16 条。第一只小猫待分配的鱼有 16×3/2+1=25 条。
答案
#include<bits/stdc++.h>
using namespace std;
int main(){
//1)确定猫数量n,丢鱼数量i
int n,i;
cin>>n>>i;
//2)枚举所有鱼的数量(从小到大)
for(int first=n+i;;first+=n){
//3)模拟拿鱼过程,判断是否符合
//3.1)假设可以
bool flag=true;
//3.2)验证拿鱼是否成立
int cnt=first;//拷贝最初鱼的数量
for(int j=n-1;j>=1;j--){
if(cnt%(n-1)!=0){
flag=false;
break;
}
//还原出下一只猫沙滩的状态
cnt=cnt/(n-1)*n+i;
}
//4)根据flag输出
if(flag){
cout<<cnt;
return 0;
}
}
}
第2题 [GESP202312 三级] 单位转换
题目描述
小杨这周的数学作业是做单位转换,喜欢编程的小杨决定编程帮他解决这些问题。
小杨只学了长度单位和重量单位,具体来说:
-
长度单位包括千米(
km
)、米(m
)、毫米(mm
),它们之间的关系是:1km=1000m=1000000mm。 -
重量单位包括千克(
kg
)、克(g
)、毫克(mg
),它们之间的关系是:1kg=1000g=1000000mg。
小杨的作业只涉及将更大的单位转换为更小的单位,也就是说,小杨的作业只会包含如下题型:米转换为毫米,千米转换为毫米,千米转换为米,克转换为毫克,千克转换为毫克,千克转换为克。
现在,请你帮忙完成单位转换的程序。
输入格式
输入的第一行为一个整数,表示题目数量。
接下来 N 行,每行一个字符串,表示转换单位的题目,格式为 x 单位 1=? 单位 2。其中,x 为一个不超过 1000 的非负整数, 单位 1 和 单位 2 分别为两个单位的英文缩写,保证它们都是长度单位或都是重量单位,且 单位 1 比 单位 2 更大。
例如,如果题目需要你将 1km 转换为 mm,则输入为 1 km = ? mm
。
保证 1≤N≤1000。
输出格式
输出 N 行,依次输出所有题目的答案,输出时,只需要将输入中的 ? 代入答案,其余部分一字不差地输出即可。由于小杨的题目只涉及将更大的单位转换为更小的单位,并且输入的 x 是整数,因此答案一定也是整数。
例如,如果题目需要你将 1km 转换为 mm,则输入为 1 km = ? mm
。则你需要输出 1 km = 1000000 mm
。
输入输出样例
输入 #1
2
1 km = ? mm
1 m = ? mm
输出 #1
1 km = 1000000 mm
1 m = 1000 mm
输入 #2
5
100 m = ? mm
1000 km = ? m
20 kg = ? g
200 g = ? mg
0 kg = ? mg
输出 #2
100 m = 100000 mm
1000 km = 1000000 m
20 kg = 20000 g
200 g = 200000 mg
0 kg = 0 mg
答案
#include<bits/stdc++.h>
using namespace std;
//统一换算成 mm/mg
int f(string s){
if(s=="km"||s=="kg") return 1000000;
else if(s=="m"||s=="g") return 1000;
else return 1;
}
int main(){
//1)确定数据数量n
int n;cin>>n;
//2)填充每个数据
while(n--){
//2.1)确定旧值,旧单位
int old_val;
string old_unit;
cin>>old_val>>old_unit;
//2.2)确定新单位
char temp;
string new_unit;
cin>>temp>>temp>>new_unit;
//3)计算换算结果
int ans=old_val*f(old_unit) / f(new_unit);
//4)输出
printf("%d %s = %d %s\n",old_val,old_unit.c_str(),ans,new_unit.c_str());
}
}