CCF-GESP 等级考试 2026年3月认证C++一级真题解析

2026年3月真题

一、单选题(每题2分,共30分)


正确答案:B

考察知识点:计算机相关知识

解析:输入设备是从外界获取信息交付计算机进行处理,重力传感器检测重心,遥控器接受指令,摄像头拍摄其他机器人,都是从外界获取信息,交付计算机,都属于输入设备。B选项 预装的 AI 算法程序是软件,并非硬件输入设备。答案为B。


正确答案:A

考察知识点:计算机相关知识

解析:修改文件的名字,通过 "重命名"操作。答案为A。


正确答案:D

考察知识点:标识符的命名规则

解析:标识符(变量)的命名规则:只能包含字母、数字和下划线;不能以数字开头;不能和关键字重名。此外,C++标识符区分大小写,PI、pi、Pi是三个不同的标识符。

变量必须先定义后使用,A、B使用前pi和Pi之前没定义,错误。C,PI不违背标识符的命名规则,可用于给变量、常量命名,C错误。

只有D正确,答案为D。


正确答案:D

考察知识点:基本运算符

解析:乘(*),取余(%),优先级i相同,从左往右计算。3*3%2=9%2=1。答案为D。


正确答案:A

考察知识点:基本运算符

解析:a、b的初始值为4。

a,b=3,4,是三个独立的表达式:表达式1:a;表达式2:b=3;表达式3:4。从左往右执行,将b值更改成3。a值为4,b值为3。计算输出,结果为A。


正确答案:A

考察知识点:基本数据类型

解析:一般来说,往变量中输入数据,需要数据类型匹配。但如果数据类型不匹配,也不会报错,只是实际存储内容和预期会有不同。答案为A。


正确答案:B

考察知识点:控制语句结构-选择

解析:官方给的答案是B。但分析下来本题没有正确答案。考虑N为2147483647,M为-1,输出-2147483648,排除A、B选项。 当N和M是相等的整数,输出为0,排除C选项。 当输入的第一个数为带小数点的数,会发现第二个数根本输入不进去,此时M第一个数的整数部分,N为0,输出第一个数的整数部分。排除D选项。

因此本题没有正确答案。



正确答案:D

考察知识点:控制语句结构-循环

解析:初始值:tnt = 1,i = 0

循环执行过程:

i=0:tnt *= 0 → tnt = 1 * 0 = 0

i=1:tnt *= 1 → tnt = 0 * 1 = 0

i=2:tnt *= 2 → tnt = 0 * 2 = 0

i=3:tnt *= 3 → tnt = 0 * 3 = 0

i=4:tnt *= 4 → tnt = 0 * 4 = 0

循环结束后,i自增为5(不满足i < 5的条件,退出循环)

最终printf输出tnt=0和i=5,格式为%2d%2d,即 0 5

因此输出为 0 5。答案为D。


正确答案:D

考察知识点:控制语句结构-循环

解析:序列:-1 + 2 + 3 - 4 + 5 + 6 - 7 + 8 + 9 - 10...

符号规律:第 1、4、7、10... 项为负,其余为正。即:项数 i 满足 i % 3 == 1 时为负,否则为正。

A:错误。i < N + 1 是正确写法,改为 i < N 会少算第 N 项。

B:错误。改为 i % 3 == 0 会让第 3、6、9... 项取负,与原序列规律不符。

C:错误。i % 3 等价于 i % 3 != 0,会让第 3、6、9... 项取正,其余取负,效果不同。

D:正确。当前代码完全符合题目序列规律和计算目标。答案为D。


正确答案:B

考察知识点:控制语句结构-循环、continue关键字

解析:循环范围:i从 1 遍历到 9;

判断逻辑:若i为偶数(i%2==0),执行continue跳过输出;若i为奇数,执行else分支输出i + "#";

遍历结果:输出的i为 1、3、5、7、9,对应字符串为1#3#5#7#9#;循环结束:i自增至 10,执行cout << i << "END",输出10END;最终输出:1#3#5#7#9#10END。

A:错误。与上述执行结果不同;

B:正确。删除else后,偶数执行continue跳过后续代码不输出,奇数执行cout输出,和原有逻辑相同。

C:错误。将cout移入L1(continue行下),偶数会执行cout输出,与原代码 "偶数不输出" 的效果矛盾;

D:错误。新增if(i>10),但循环结束后i的值为10,条件不成立没有输出。

答案为B。


正确答案:B

考察知识点:流程控制语句-循环、数位分离

解析:数位分离是编程中常见的基础操作,核心思路是通过取余(%)获取当前数的最后一位,通过整除(/)去掉最后一位,循环执行直到数变为 0。在每轮循环中,将获取的最后一位累加起来。答案为B。


正确答案:B

考察知识点:流程控制语句-循环、数位分离

解析:数位分离是编程中常见的基础操作,核心思路是通过取余(%)获取当前数的最后一位,通过整除(/)去掉最后一位,循环执行直到数变为 0。在每轮循环中,对获取的最后一位进行判断,若为奇数,计数器odd_count进行自增1操作。

第11行代码:N=(N-N%10)/10 等价与 N/=10。答案为B。



正确答案:D

考察知识点:基本运算符、数位分离

解析:拼接四位数:

若 M > N,则四位数 Q = M100 + N(如 M=85, N=79 → Q=8579);
若 M ≤ N,则四位数 Q = N
100 + M(如 M=79, N=85 → Q=8579)。

代码 L1 行 if(M > N) 逻辑正确。

生成五位数:

五位数 = Q * 10 + (Q % 3)(如 Q=8579,8579%3=2 → 五位数 857910+2=85792)。
代码 L2 行 (Q
10+Q%3) % 14 == 0 完全符合 "判断五位数能否被 14 整除" 的要求。

A、B、C都错误。可以不使用Q,在区分大小写之后,分别用相应的公式代替现有代码中的Q既可,D正确,答案为D。


正确答案:B

考察知识点:基本运算符、数位分离

解析:N作为一个6位数,N/1000可以得到其高3位,N%1000可以得到其低3位。接下来可用:(N/1000-N%1000)%314==0,描述题目的要求:一个6位正整数 N 的高3位和低3位的差是否是314的倍数。答案为B。


正确答案:A

考察知识点:流程控制语句-循环、数位分离

解析:N1和N2分别储存奇数位的数位和偶数位的数位和,因此一次循环要进行两次数位分离,分别存入N1和N2。答案为A。

二、判断题(每题2分,共20分)


正确答案:正确

考察知识点:计算机基础知识

解析:电话手表要运行第三方应用,必须搭载操作系统(比如常见的儿童手表系统,或基于 Android 定制的穿戴设备系统),否则只能执行预设功能,无法安装新应用。 表述正确。


正确答案:正确

考察知识点:基本运算符

解析:4%2结果为0;2*2%2,先算乘后算取余,结果也为0。表述正确。


正确答案:错误

考察知识点:流程控制语句-循环、break

解析:for循环:循环变量i初始化为1,当i<10时执行循环体,i++每次循环自增1。

循环体:如果i%3==0满足,执行break。

则循环执行到i=3时触发break,提前终止循环;循环结束时,i的值为3,输出3。表述错误。


正确答案:错误

考察知识点:流程控制语句-循环

解析:代码第 5 行末尾多了一个分号;,导致for循环的循环体为空,total += i;只在循环结束后执行一次,无法实现求和。表述错误。


正确答案:正确

考察知识点:流程控制语句-循环

解析:若输入0,则while循环的循环条件 为假(0为假),一次循环不执行。若输入非0,则while循环的循环条件 为真(非0为假),循环体只输出N而不改变N的值,则循环条件永远为真,执行无数次。表述正确。



正确答案:正确

考察知识点:流程控制语句-循环、数位分离

解析:利用数位分离实现数字反转进行回文数判断。

数位分离是编程中常见的基础操作,核心思路是通过取余(%)获取当前数的最后一位,通过整除(/)去掉最后一位,循环执行直到数变为 0。

第7行代码,反转数拼接的关键公式:反转数 = 反转数 * 10 + 分离出的个位数字;

表述正确。


正确答案:正确

考察知识点:控制语句结构-循环

解析:total中累加上的数依次为:-N,-(N-2),-(N-4),...,(N-4),(N-2)。可见只有-N没有被抵消掉,最后total的值为-N。表述正确。


正确答案:错误

考察知识点:标准化输入输出,基本数据类型

解析:%d int类型占位符,给后边的int类型数据占位。当之后数据不是int类型也不会报错,输出结果为数据可转成的整数数据,3.14可装成的整数为3,输出为3。表述错误。


正确答案:正确

考察知识点:控制语句结构-循环

解析:循环中 i 从 1 开始,每次循环执行 cnt += i++,这会让 i 在一次循环中自增两次:

先把当前 i 加到 cnt,然后 i 自增 1;

循环末尾 i++ 再让 i 自增 1。

所以实际参与累加的 i 取值为:1, 3, 5, ..., 99(所有 1~99 的奇数)。

利用等差数列求和公式可求出结果为2500,表述正确。


正确答案:错误

考察知识点:标准化输入输出

解析:%-5d,int类型占位符,要求之后数据按照 占5位左对齐进行输出,不足5位补空格,输出结果为"314 ",表述错误。

三、编程题(每题25分,共50分)


本题考察分支结构。

版本1:只使用分支语句,代码如下

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main() {
	int h1, h2, h3, h4, cha, minn, ans;  //minn存最小差值,ans存结果
	cin>>h1>>h2>>h3>>h4;
	//计算h1和h2的身高差存储到cha中 
	if(h1<h2) cha=h2-h1;
	else cha=h1-h2;
	//假定h2是Alice的朋友 
	minn=cha; 
	ans=h2;
	//计算h1和h3的身高差存储到cha中
	if(h1<h3) cha=h3-h1;
	else cha=h1-h3;
	if(cha<minn || cha==minn && h3<ans){ //差值更小,或者差值一样但更矮
		minn=cha;
		ans=h3;
	}
	//计算h1和h4的身高差存储到cha中
	if(h1<h4) cha=h4-h1;
	else cha=h1-h4;
	if(cha<minn || cha==minn && h4<ans){
		minn=cha;
		ans=h4;
	}
	cout<<ans;
	return 0;
}

版本2:使用for循环,代码如下

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main() {
	int h1, h, minn=200, ans=199; 
	cin>>h1;
    for(int i=1; i<=3; i++){ //循环3次,输入3个人的身高
        cin>>h;
        //计算和h1的身高差
        int cha=h1-h;
        if(cha<0) cha=-cha;
        //cha = abs(h1-h); //也可用abs函数求解绝对值
        //如果身高差更小,或者身高差一样但更矮,更新
        if(cha<minn || cha==minn && h<ans){
            minn=cha;
            ans=h;
        }
    }
	cout<<ans;
	return 0;
}


本题考察 循环结构。

版本1:利用数位分离+位权概念重新组合数。数位分离是编程中常见的基础操作,核心思路是通过取余(%)获取当前数的最后一位,通过整除(/)去掉最后一位,循环执行直到数变为 0。代码如下:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main() {
	int n, s=0, w=1; //w表示位权 
	cin>>n;
	while(n){
		int tmp=n%10;
		if(tmp==4) tmp=8; //取出数位上的数,若为4,更换成8 
		s+=tmp*w; //位权*数位累加 
		w*=10;  //更新位权 
		n/=10;
	}
	cout<<s;
	return 0;
}

版本2:不把输入看作是一个整数,而是一个一个字符,则本题为不限字符输入,用一个比较少用的知识点,将输入作为while循环的条件。代码如下:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main() {
	char ch; 
	while(cin>>ch){  //输入次数未知可用
		if(ch=='4') cout<<'8';
		else cout<<ch;
	}
	return 0;
}

版本3:如果已经学过数组和字符串,下面提供两个分别用到数组和字符串的代码。

版本3.1:使用数组存储数位分离出的每一位上的数,如果是4,更改为8。先存储的是先分离出的个位,最后存储的是最后分离出的高位。因此输出要从后往前输出。需要注意的是,如果输入的是0,数组里一个数也没有,会产生错误,因此0要提前特殊处理。代码如下:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main() {
	int n, arr[10], cnt=0;
	cin>>n;
	if(n==0){
		cout<<n;
		return 0; 
	} 
	while(n){
		int tmp=n%10;
		if(tmp==4) tmp=8;
		arr[cnt++]=tmp;
		n/=10;
	}
	for(int i=cnt-1; i>=0; i--) cout<<arr[i];
	return 0;
}

版本3.2:使用字符串,将整数直接当作一个字符串处理,这里用字符数组或者string来存储字符串都可。代码如下:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main() {
	string n;
	cin>>n;
	for(int i=0; i<n.size(); i++){
		if(n[i]=='4') n[i]='8';
	}
	cout<<n;
	return 0;
}

写在最后,本次一级的题目可谓是历史最难的一级的题目,甚至比同期的二级题目还要难,如果你才学完循环,那没做出来真的不是你的错,如果你已经学完了数组和字符串,但考场没往这方面想,那你需要注意在日常的训练里,对于同一道题,多尝试从不同角度去思考解题思路,注意知识点的灵活应用,融会贯通。

相关推荐
2401_891482173 小时前
C++中的代理模式实战
开发语言·c++·算法
2401_838683373 小时前
C++中的代理模式高级应用
开发语言·c++·算法
暮冬-  Gentle°7 小时前
C++中的命令模式实战
开发语言·c++·算法
卷福同学9 小时前
【养虾日记】Openclaw操作浏览器自动化发文
人工智能·后端·算法
春日见10 小时前
如何入门端到端自动驾驶?
linux·人工智能·算法·机器学习·自动驾驶
㓗冽10 小时前
分解质因数-进阶题10
c++
图图的点云库10 小时前
高斯滤波实现算法
c++·算法·最小二乘法
一叶落43811 小时前
题目:15. 三数之和
c语言·数据结构·算法·leetcode
CoderCodingNo11 小时前
【GESP】C++七级考试大纲知识点梳理, (1) 数学库常用函数
开发语言·c++