欢迎大家订阅我的专栏:算法题解:C++与Python实现!
本专栏旨在帮助大家从基础到进阶 ,逐步提升编程能力,助力信息学竞赛备战!
专栏特色
1.经典算法练习:根据信息学竞赛大纲,精心挑选经典算法题目,提供清晰的代码实现与详细指导,帮助您夯实算法基础。
2.系统化学习路径:按照算法类别和难度分级,从基础到进阶,循序渐进,帮助您全面提升编程能力与算法思维。
适合人群:
- 准备参加蓝桥杯、GESP、CSP-J、CSP-S等信息学竞赛的学生
- 希望系统学习C++/Python编程的初学者
- 想要提升算法与编程能力的编程爱好者
附上汇总帖:GESP认证C++编程真题解析 | 汇总
单选题
第1题
小杨父母带他到某培训机构给他报名参加CCF组织的G ESP认证考试的第1级,那他可以选择的认证语言有( )种。
A.1
B.2
C.3
D.4
【答案】:C
【解析】
GESP考察语言为图形化(Scratch)编程、Python编程及C++编程。
第2题
下面流程图在yr输入2024时,可以判定yr代表闰年,并输出出2月是29天,则图中菱形框中应该填入( )。
A.(yr % 400 == 0) || (yr % 4 == 0)
B.(yr % 400 == 0) || (yr % 4 ==0 && yr % 100 !=0)
C.(yr % 400 == 0) && (yr % 4 == 0)
D.(yr % 400 == 0) && (yr % 4 == 0 && yr % 100 != 0)
【答案】:B
【解析】
考察判断闰年的条件,非整百年份:能被4整除的是闰年(如2004年就是闰年,2001年不是闰年)。整百年份:能被400整除的是闰年(如2000年是闰年,1900年不是闰年)。
&&“条件与”, x&&y:x和y均为true, 取值是true, 否则取值是false。
|| 逻辑“或”,x || y:x和y均为false, 取值是false, 否则取值是true。
第3题
一般默认64位计算机系统中整型变量(int)还是32位, 则整数能够表示的数据范围是( )。
A.0 ∼ 2 32 0\sim 2^{32}0∼232
B.0 ∼ 2 64 0\sim 2^{64}0∼264
C.− 2 31 ∼ ( 2 31 ) − 1 -2^{31}\sim (2^{31})-1−231∼(231)−1
D.− 2 63 ∼ ( 2 63 ) − 1 -2^{63}\sim (2^{63})-1−263∼(263)−1
【答案】:C
【解析】
考察int类型的取值范围, int存储时占32位, 其中一位是符号位, 所以取值范围为-2147483648~2147483647,即选项C。
第4题
下列代码将十进制转化成八进制,则横线上应填入( )。
#include<iostream>usingnamespacestd;voiddecimal2octal(intdecimal){intoct_number[100];inti=0;while(decimal>0){____// 在此处填入代码}for(intj=i-1;j>=0;j--){cout<<oct_number[j];}cout<<endl;}A.oct_number[i] = decimal % 8; decimal /= 8;
B.oct_number[i] = decimal / 8; decimal %/= 8;
C.oct_number[i++] = decimal % 8; decimal /= 8;
D.oct_number[i++] = decimal / 8; decimal %= 8;
【答案】:C
【解析】
【解析】考察进制转换,除8取余法:将十进制数连续除以8,每次的余数就是八进制数的一位,而商继续除以8,直到商为0为止。将余数从下往上排列,得到的数字就是十进制数的八进制表示。
第5题
二进制数101.11对应的十进制数是( )。
A.6.5
B.5.5
C.5.75
D.5.25
【答案】:C
【解析】
二进制整数转化十进制:从二进制数的右边第一位起,从右往左,先用二制位置上的数乘以2的相应位数的幂,然后把每一位的乘积相加即可得到二进制数对应的十进制数。
小数的二进制数转化为十进制数的方法,从左往右,用二进制位数上的数字乘以2的负位数次幂,然后把所有乘积相加即可得。
第6题
下列流程图的输出结果是( )。
A.5
B.10
C.20
D.30
【答案】:B
【解析】
嵌套循环的流程图,外层循环遍历i:04,内层循环j:0i-1,每循环一次sum加1, 内外层循环执行次数为:0+1+2+3+4=10, 所以sum值最终为10。
第7题
下列代码的输出结果是( )。
#include<iostream>usingnamespacestd;intmain(){inta=12;intresult=a>>2;cout<<result<<endl;return0;}A.12
B.6
C.3
D.1
【答案】:C
【解析】
右移运算符,12的二进制位为1100,右移两位后为11,二进制11转化为十进制是3。
第8题
下列代码的输出结果是( )。
#include<iostream>usingnamespacestd;intmain(){inta=5;intb=10;a=a^b;b=a^b;a=a^b;cout<<"a = "<<a<<", b = "<<b<<endl;return0;}A.a = 5, b = 10
B.a = 5, b = 5
C.a = 10, b = 5
D.a = 10, b = 10
【答案】:C
【解析】
^是异或运算符,用于两个操作数的二进制位的异或运算。当两个操作数的某一位相同(同为0或同为1)时,结果为0,不同时结果为1。这段代码是通过异或运算交换两个变量的值。
第9题
如果字符串定义为char str[]=“GESP”; , 则字符数组str的长度为( ) 。
A.0
B.4
C.5
D.6
【答案】:C
【解析】
字符数组里每一个字符都占据一个存储单元,且以’\0’作为结尾,'\0’用于标记字符串的结束位置。\'0’虽然是一个特殊的字符,但在字符数组中,它也是一个实实在在的字符,占用一个存储单元。
第10题
在下列代码的横线处填写( ),可以使得输出是“7”。
#include<iostream>usingnamespacestd;intmain(){intarray[5]={3,7,5,2,4};intmax=0;for(inti=0;i<5;i++)if(____)// 在此处填入代码max=array[i];cout<<max<<endl;return0;}A.max > array[i]
B.max < array[i]
C.max = array[i]
D.以上均不对
【答案】:B
【解析】
本题代码用一维数组存储数据, 然后for循环遍历找最大值。判断条件为如果array[i]比原来存储的最大值max还要大, 就更新最大值。
第11题
小杨在做数学题,题目要求找出从1到35中能被7整除的数字,即[7,14,21,28,35],则横线处应填入哪个代码?( )
#include<iostream>usingnamespacestd;intmain(){intarr[35];intcount=0;for(inti=1;i<=35;i++){if(i%7==0)____// 在此处填入代码}for(inti=0;i<count;i++)cout<<arr[i]<<endl;return0;}A.arr[count++]=i;
B.arr[i] = count++;
C.arr[i] = count;
D.arr[count] = count++;
【答案】:A
【解析】
循环遍历i:1~35找能被7整除的数字,如果i满足条件,i存储到数组里,数组下标用count控制, arr[count++] =i; 是把i值放入arr[count] , 然后count自增。
第12题
已知字符’0’的ASCII编码的十进制表示为48,则执行下面C++代码后,,输出是( )。
#include<iostream>usingnamespacestd;intmain(){string s="0629";intn=s.length();intx=0;for(inti=0;i<n;i++)x+=s[i]cout<<x<<endl;return0;}A.17
B.158
C.209
D.316
【答案】:C
【解析】
字符串里的字符是用ASCII码存储, x累加的是字符的ASCII码值, 字符’0’的ASCII码值是48, 字符’2’的ASCII码值是50, 字符’6’的ASCII码值是54, 字符’9’的ASCII码值是57,48+50+54+57=209。
第13题
某小学男子篮球队招募新成员员,要求加入球队的成员身高在135厘米以上(不含135厘米)。本次报名的人员有10人,他们的身高分别是125、127、136、134、137、138、126、135、140、145。完善以下代码,求出本次球队能够招募到新成员的人数?( )
#include<iostream>usingnamespacestd;intmain(){intarr[10]={125,127,136,134,137,138,126,135,140,145};intcount=0;for(inti=0;i<10;i++)____// 在此处填入代码cout<<count<<endl;return0;}A.count = arr[i]>135 ? 1 : 0;
B.count += arr[i]>135 ? 1 : 0;
C.count++;
D.以上都不对
【答案】:B
【解析】
循环遍历所有身高,统计135以上的个数。?:是三目运算符。
表达式1 ? 表达式2 : 表达式3。先求解表达式1,若其值为真(非0)则将表达式2的值作为整个表达式的取值,否则(表达式1的值为0)将表达式3的值作为整个表达式的取值。B选项的功能是如果arr[i] >135, count加1否则加0。
第14题
下面可以正确输出They’re planning a party for their friend’s birthday.的C++语句是?( )
A.cout << 'They\‘re planning a party for their friend’\s birthday." << endl;
B.cout << “They\'re planning a party for their friend’s birthday.” << endl;
C.cout << ‘They’re planning a party for their friend’s birthday.’ << endl;
D.cout << “They\'re planning a party for their friend\'s birthday.” << endl;
【答案】:D
【解析】
字符串需要用双引号""括起来。
第15题
如果执行下面C++代码后, 输出的结果是“gesp ccf org cn" ,则横线上应填入哪个代码?( )
#include<iostream>usingnamespacestd;intmain(){string str="gesp.ccf.org.cn";string delimiter=".";string result="";string token;size_t found=str.find(delimiter);while(found!=string::npos){token=str.substr(0,found);result+=token;result+=" ";____// 在此处填入代码found=str.find(delimiter);}//最后一部分result+=str;result+=" ";cout<<result<<endl;return0;}A.str = str.substr(found + delimiter.length(), str.length()-1);
B.str = str.substr(found, str.length());
C.str = str.substr(found, str.length()-1);
D.以上都不对
【答案】:A
【解析】
观察原字符串和输出结果可知,程序的目的是找到所有的点".“,换成空格” “,横线处需要填写的语句功能为将截取str第一个”."后的部分重新赋给str。
判断题
第16题
GESP测试是对认证者的编程能力进行等级认证, 同一级别的能力基本上与编程语言无关。
A.正确
B.错误
【答案】:A
【解析】
GESP赛事规则
第17题
整数-6的16位补码可用十六进制表示为FFFA。
A.正确
B.错误
【答案】:A
【解析】
考察数据编码中的反码,负整数的补码,将其原码除符号位外的所有位取反(0变1,1变0,符号位为1不变)后加1, -6的16位补码用十六进制表示为FFFA。
第18题
补码的优点是可以将减法运算转化为加法运算,从而简化计算机的硬件设计。
A.正确
B.错误
【答案】:A
【解析】
考察数据编码知识,补码的优点是:可以将减法运算转化为加法运算,简化了运算过程。
第19题
字符常量’\0’常用来表示字符串结束,和字符常量’0’相同。
A.正确
B.错误
【答案】:B
【解析】
字符常量’\0’是字符串的结束标记, 它的ASCII码为0, 字符常量’0’的ASCII码为48,与’\0’是不同的字符常量。
第20题
数组的所有元素在内存中可以不连续存放。
A.正确
B.错误
【答案】:B
【解析】
数组元素在内存中是连续存放的。
第21题
C++中可以对数组和数组的每个基础类型的元素赋值。
A.正确
B.错误
【答案】:B
【解析】
不能对数组赋值,但可以对数组的每个基础类型的元素赋值。
第22题
如果a为int类型的变量, 且表达式((a|3) ==3) 的值为true, 则说明a在从0到3之间(可能为0、可能为3)。
A.正确
B.错误
【答案】:A
【解析】
((a|3)==3)说明a只在二进制的最低位和第二低位可能为1,所以0≤a≤3。
第23题
执行下面C++代码后,输出的结果是8。
inta=0b1010;intb=01100;intc=a&b;cout<<c<<endl;A.正确
B.错误
【答案】:A
【解析】
0b是二进制表示,b是八进制,&:按位与,输出结果为0。
第24题
执行下面C++代码后,输出的结果不可能是89781。( )
#include<iostream>#include<cstdlib>// 为了使用rand()和srand()#include<ctime>// 为了使用time()usingnamespacestd;intmain(){// 设置随机种子srand(time(NULL));inti=1;it s[5];while(i<=5){inta=rand()%10;if(a%3==(i+1)%3)s[i++]=a;}for(inti=1;i<=5;i++)cout<<s[i];cout<<endl;return0;}A.正确
B.错误
【答案】:A
【解析】
第14行a的取值范围是0~9,15行通过比较赋值,第一位可能为2,5,8,第二位可能为0,3,6,9,第三位可能为1,4,7,第四位可能为2,5,8,第五位第一位可能为0,3,6,9。最后一位不可能输出1。
第25题
把整数3025从中剪开分为30和25两个数,此时再将这两数之和平方,计算结果又等于原数。(30+25)×(30+25)=55×55=3025,这样的数叫“雷劈数”。可以使用枚举的方法求出所有符合这样条件的四位数。( )
A.正确
B.错误
【答案】:A
【解析】
枚举法:逐一列举问题所涉及的所有情形,并根据问题提出的条件检验哪些是问题的解,哪些应予排除。
编程题
B4003 移位
【题目来源】
洛谷:[B4003 GESP202406 三级] 移位 - 洛谷
【题目描述】
小杨学习了加密技术移位,所有大写字母都向后按照一个固定数目进行偏移。偏移过程会将字母表视作首尾相接的环,例如当偏移量是3的时候,大写字母A会替换成D,大写字母Z会替换成C,总体来看大写字母表ABCDEFGHIJKLMNOPQRSTUVWXYZ会被替换成DEFGHIJKLMNOPQRSTUVWXYZABC。
注:当偏移量是26的倍数时,每个大写字母经过偏移后会恰好回到原来的位置,即大写字母表ABCDEFGHIJKLMNOPQRSTUVWXYZ经过偏移后会保持不变。
【输入】
第一行包含一个正整数n。
【输出】
输出在偏移量为n的情况下,大写字母表ABCDEFGHIJKLMNOPQRSTUVWXYZ移位替换后的结果。
【输入样例】
3【输出样例】
DEFGHIJKLMNOPQRSTUVWXYZABC【算法标签】
《洛谷 B4003 移位》 #字符串(入门)# #GESP# #2024#
【代码详解】
#include<bits/stdc++.h>usingnamespacestd;intmain(){intn;cin>>n;for(inti=0;i<26;i++){intj=(i+n)%26;// j:字符偏移后离'A'的距离charch='A'+j;// ch:距离'A'为j的字符cout<<ch;//输出偏移后的字符}return0;}【运行结果】
3 DEFGHIJKLMNOPQRSTUVWXYZABCB4004 寻找倍数
【题目来源】
洛谷:[B4004 GESP202406 三级] 寻找倍数 - 洛谷
【题目描述】
小杨有一个包含n个正整数的序列A = [ a 1 , a 2 , … , a n ] A=[a_1, a_2, \dots, a_n]A=[a1,a2,…,an],他想知道是否存在i ( 1 ≤ i ≤ n ) i(1\le i\le n)i(1≤i≤n)使得a i a_iai是序列A中所有数的倍数。
【输入】
第一行包含一个正整数t,代表测试用例组数。
接下来是t组测试用例。
对于每组测试用例,一共两行。其中,第一行包含一个正整数n;第二行包含n个正整数,代表序列A。
【输出】
对于每组测试用例,如果存在i ( 1 ≤ i ≤ n ) i(1\le i\le n)i(1≤i≤n)满足对于所有在k ( 1 ≤ k ≤ n ) k(1\le k\le n)k(1≤k≤n)a i a_iai是a k a_kak的倍数,输出Yes,否则输出No。
【输入样例】
2 3 1 2 4 5 1 2 3 4 5【输出样例】
Yes No【算法标签】
《洛谷 B4004 寻找倍数》 #数学# #枚举# #数组# #GESP# #2024#
【代码详解】
#include<bits/stdc++.h>usingnamespacestd;constintN=1e5+10;inta[N];intmain(){intt;cin>>t;while(t--){//t组测试数据intn;cin>>n;//每组n个数intx=0;//x存该组数中的最大值for(inti=1;i<=n;i++){//输入数据,找最大值cin>>a[i];x=max(x,a[i]);}intfl=0;//标志变量for(inti=1;i<=n;i++){//遍历数组元素if(x%a[i])// 如果x不是a[i]的倍数fl=1;//改变标志变量的值}if(fl)cout<<"No"<<endl;elsecout<<"Yes"<<endl;}return0;}【运行结果】
2 3 1 2 4 Yes 5 1 2 3 4 5 No