☰
海淀区信息学竞赛1103试题解析:C++基础与程序阅读拿分指南
2026/10/27 4:42:35 网站建设 项目流程

简介:这份2024年海淀区中小学生信息学竞赛校级预选赛试题,面向准备参加信息学竞赛的中小学生及指导教师,可用于赛前自测、熟悉题型与定位知识薄弱点。试卷由编程基础知识单选题和程序阅读单选题构成,覆盖变量命名、赋值语句、数据类型、二进制与十进制转换、表达式运算、逻辑判断、函数定义与调用、循环语句、数组及排序比较次数等内容,并通过多段程序阅读题训练代码执行结果推断能力。资源包共1个PDF文件,约422KB,结构紧凑,便于直接打印或在线练习。已有582人学习,适合需要了解海淀区校级预选赛命题风格、开展阶段性检测或进行课堂练习的读者使用,也能为教师选题、讲评和分层辅导提供参考。

1. 海淀区信息学竞赛校级预选赛:1103 这套卷子到底考什么、怎么拿分

提到海淀区信息学竞赛,很多家长和考生的第一反应是“牛娃扎堆”“题难到怀疑人生”,但真拿到 2024 年校级预选赛这套 1103 试题,你会发现它的考点分布其实非常老实——编程基础知识、程序阅读、问题阅读三块,没有偏题怪题,拼的是基本功扎不扎实、读代码时脑子清不清楚。这份卷子适合小学高年级到初中低年级、刚学完 C++ 基础语法和简单算法的学生用来摸底,也适合准备冲刺区级初赛的人拿来检验自己“人肉编译器”的能力。拿分的核心逻辑只有一句话:基础概念题不丢分,程序阅读题稳住节奏,问题阅读题学会拆题干。下面按题型模块把高频考点、真题答法和易错点逐层拆开,你照着练就能把该拿的分攥住。

2. 编程基础知识:变量、进制、表达式与函数的高频判断题

这一块是整张卷子的“送分区”,但也是翻车率不低的地方。题目全是单选题,考点集中在变量命名、赋值语句写法、二进制转十进制、表达式运算结果、函数特性、循环语句性质、二维数组元素定位这几类。看起来是概念题,实际上每道题都在考你“有没有真正在编译器里跑过代码”。死记语法规则不够,得知道规则背后的原因。

2.1 变量命名与赋值语句:合法性的判断标准

变量命名题几乎每年都出,问法也固定:下列哪个是合法变量名。判断标准就三条——首字符必须是字母或下划线,不能是数字;不能是 C++ 关键字;中间不能有空格和特殊符号。像int、for、return这类保留字直接排除,2a这种数字开头的也排除。很多考生栽在“看起来像合法但其实是关键字”的选项上,比如double、case这种,平时写代码时没注意,考试时就容易犹豫。

赋值语句题问的是“写法一定错误的是”,这个“一定”很关键。正确的赋值语句左边必须是变量,右边是表达式或常量,分号结尾。常见错误选项有两类:一是把常量或表达式放在等号左边,比如3 = x;或a + b = c;;二是用引号把字符串赋给字符变量,比如char c = "a";——注意双引号是字符串,单引号才是字符。答题时先看等号左边是不是变量,再看引号对不对,两个步骤就能排除大部分错误选项。

提示:字符变量赋值时,'a'是字符常量,"a"是字符串常量,后者赋给char变量在 C++ 里是类型不匹配的写法。这个点在初学阶段特别容易混。

2.2 二进制转十进制与表达式求值:手算不出错的步骤

二进制转十进制是必考题,方法就是按权展开:从右往左第 ( i ) 位(从 0 开始)的权值是 ( 2^i ),把每一位乘上对应权值再求和。比如1011就是 ( 1\times2^3 + 0\times2^2 + 1\times2^1 + 1\times2^0 = 8+0+2+1=11 )。考场上建议在草稿纸上把权值序列先写出来:1、2、4、8、16、32……然后对齐每一位,避免加错。

表达式求值题会混合算术运算符、关系运算符和逻辑运算符。答题顺序按优先级来:先算括号,再算乘除取余,然后加减,接着关系运算(<、>、==等),最后逻辑运算(&&、||、!)。关系表达式的结果是逻辑值true或false,在 C++ 里参与运算时true当 1、false当 0。很多考生在“关系表达式的结果是什么类型”这类概念题上失分,记住一点:关系运算和逻辑运算的结果都是布尔值,不是数值本身。

2.3 函数特性与循环语句:概念题的判断套路

函数相关的单选题喜欢考几个固定判断点:每个程序有且只有一个主函数,程序从主函数开始执行;函数可以嵌套调用,但不能嵌套定义;递归函数是函数自己调用自己,递归必须有终止条件。题目里如果出现“函数不支持嵌套”这种说法,要看清楚它说的是“嵌套调用”还是“嵌套定义”——调用是允许的,定义是不允许的。这种咬文嚼字的选项就是拉开分差的地方。

循环语句的考点集中在for、while、break、continue的语义上。for和while都能实现确定次数的循环,不能说“while专门用于不确定次数”。break是跳出整个循环,continue是跳过本次循环剩余部分、直接进入下一次循环判断。有一道真题的选项写“continue只是跳过本次循环”,这个描述本身是对的,但如果选项说“continue是跳出整个循环”就是错的。读选项时盯住动词:是“跳出”还是“跳过”。

2.4 二维数组元素定位:行列映射不能搞反

二维数组题给一个定义如int a[3][2] = {2, 3, 4, 5, 6, 7},问哪个元素的值是 5。C++ 里二维数组按行优先存储,a[0][0]=2、a[0][1]=3、a[1][0]=4、a[1][1]=5、a[2][0]=6、a[2][1]=7。答案就是a[1][1]。这类题没有技巧,就是老老实实按行展开,在草稿纸上画一个 3 行 2 列的表格往里填数。考生常错在把行和列的下标顺序记反,或者忘记下标从 0 开始。做完后回代验证一遍,几秒钟的事,能避免不必要的丢分。

3. 程序阅读:八道代码题的“人肉执行”路线图

程序阅读题是整张卷子的分水岭。八道题覆盖了约数个数统计、公因数计数、最小公倍数、回文数判断、筛法标记、素数判定与偶数拆分、辗转相除法、循环退出条件。这些代码都不长,但每道题都埋了一个需要你跟着循环走一遍的坑。做这类题的方法不是“看懂大概意思就选”,而是拿草稿纸模拟变量变化,尤其是循环变量和计数器。

3.1 约数、公因数、最小公倍数:三道数论题的快读法

第一道程序阅读题统计的是 ( 1 ) 到 ( n-1 ) 中能整除 ( n ) 的数的个数,也就是 ( n ) 的真约数个数(不含 ( n ) 本身)。代码里循环条件是i < n,所以cnt统计的是小于 ( n ) 的约数数量。如果 ( n ) 是质数,真约数只有 1,cnt输出 1;如果 ( n=6 ),真约数是 1、2、3,输出 3。这道题问“输入一个整数,输出结果”,答题时先判断输入值的约数情况,再对号入座。

// 统计 n 的真约数个数(不含 n 本身) for (int i = 1; i < n; i++) if (n % i == 0) cnt++; cout << cnt;

这段代码的关键在循环上界是i < n而不是i <= n,所以 ( n ) 本身不会被计入。很多考生看到“约数个数”就默认包含自身,选了一个比正确答案大 1 的选项,这就是没盯住循环边界。

第二道题统计两个数的公因数个数,但加了一个提前退出条件:if (cnt == 6) break;。也就是说,公因数数到 6 个就停,输出 6。答题时先看两个输入数的公因数够不够 6 个,如果够,答案就是 6;如果不够,才需要老老实实数完。这道题考的是“别忽略 break 语句”。

第三道题求的是最小公倍数:先找最大公因数d,再输出a * b / d。这是标准的“最大公因数求最小公倍数”写法。阅读时注意循环从min(a,b)往下遍历,找到的第一个公因数就是最大公因数。答题时直接用公式算,不用逐行模拟。

3.2 回文数、筛法与素数判定:三个经典算法的识别

回文数题的核心函数f(x)把数字反转后和原数比较。代码里s = s * 10 + (t % 10)是反转数字的标准写法,return (s == x)判断是否回文。题目统计 ( 1 ) 到 ( n ) 中的回文数个数。答题时按位数分类数:1 到 9 全是回文数,两位数的回文数是 11、22、…、99,三位数是 101、111、…、191 这种首尾相同的。如果 ( n ) 不大,直接枚举比模拟代码更快。

筛法题用了一个标记数组,先把合数标记为 1,然后用前缀和统计 ( 1 ) 到 ( n ) 中质数的个数。代码里a[i*j] = 1是从 2 的倍数开始筛,a[i] != 0时跳过已经标记过的数。最后a[i] = a[i-1] + (1 - a[i])是把标记数组变成前缀计数。这道题的关键是理解“标记为 1 表示非质数”,输出的是质数个数。

// 埃氏筛标记合数 for (int i = 2; i <= 10000; i++) { if (a[i] != 0) continue; for (int j = 2; j <= 10000 / i; j++) a[i * j] = 1; } // 前缀和统计质数个数 for (int i = 1; i <= n; i++) a[i] = a[i-1] + (1 - a[i]); cout << a[n];

代码里的10000 / i是防止i * j越界,这个细节在阅读题里不会直接考,但理解它有助于你判断循环的终止条件。答题时如果 ( n ) 在 100 以内,直接列出质数表数个数,比跟着代码跑更稳。

素数判定题先判断n本身是不是素数,如果是输出 1;如果是偶数输出 2;如果n-2是素数输出 2;否则输出 3。这其实是哥德巴赫猜想的一个简化版本——任何大于 2 的偶数可以拆成两个素数之和,奇数如果减 2 是素数也能拆成 2 加一个素数。答题时按分支顺序走,先看n是不是素数,再看奇偶性,最后验证n-2。

3.3 辗转相除与循环退出:两道“看起来复杂”的题

辗转相除法的代码用递归实现:f(a, b)当b == 0时返回a,否则返回f(b, a % b)。输入两个整数,输出的是最大公因数。这道题不需要模拟递归过程,直接用辗转相除手算几轮就能得出答案。比如f(12, 8)→f(8, 4)→f(4, 0)→ 返回 4。

最后一道循环题从i = 1开始不断递增,跳过 7 的倍数,然后统计i的约数个数(不含 1 和自身),当约数个数恰好为 6 时输出这个i并退出。这道题需要耐心枚举:从较小的数开始试,找到第一个“非 7 的倍数且真约数个数为 6”的数。枚举时先判断能不能被 7 整除,再数列约数,别跳步。考场上如果时间紧,可以先排除选项里明显是 7 的倍数的数,缩小范围。

4. 问题阅读:四道长题干题的拆解与计算策略

问题阅读是整张卷子里阅读量最大的部分,四道题分别涉及手机应用图标排序操作、服务器压缩视频的排队时间、骰子点数组合的可能性判断、小猴爬山的高度约束。题干长、信息密,很多考生读完后脑子是蒙的。应对策略是先看问题问什么,再回头从题干里找相关条件,不要从头到尾逐字读。

4.1 手机图标排序:位置和编号是两个变量

手机图标题的坑在于“应用程序编号”和“图标位置”是两个不同的概念。题干明确提醒了这一点。初始时第 ( i ) 号应用在位置 ( p_i ),启动应用时需要先滚动到它所在的屏幕,操作次数是屏幕号减一,再双击一次。启动后图标位置和前一个应用的图标位置交换,菜单回到第一屏。

答题时画一张表:左边列应用编号,右边列当前位置。每启动一个应用,先算滚动次数加一,再更新表中两个应用的位置。这类模拟题不怕慢,就怕跳步。把每一步的操作次数累加,最后核对选项。很多考生错在“启动后菜单自动回第一屏”这个条件上——下一次启动的滚动次数是从第一屏开始算的,不是从上一次结束的屏幕位置继续算。

4.2 视频压缩排队:画时间轴比套公式更稳

服务器压缩视频题给了服务器数量、视频数量、每个视频的上传时间和时长,问哪个视频的完成时间描述错误。核心规则是:每个服务器同一时间只能压一个视频,视频按上传顺序排队,有空闲服务器就开始压。

这类题最稳的解法是画时间轴。横轴是时间,纵轴是服务器,把每个视频的上传时刻和占用时长标上去。注意第 1 个和第 ( n ) 个视频长度是 3 分钟,其余是 2 分钟,这个差异会直接影响完成时刻。答题时不用把每个选项都验证一遍,先把你算出来的完成时间列出来,和选项逐一对照,找到对不上的那个。

提示:排队题的时间单位要统一。题干里“每秒压缩 1 分钟时长”和“视频长度是分钟”容易看混,读题时把单位圈出来。

4.3 骰子与爬山:用边界条件排除错误选项

骰子题给了每个骰子的面数和所有骰子点数之和,问“下列说法正确”。这种题不需要精确算出每个骰子的点数分布,用边界条件排除就行:每个骰子的取值范围是 1 到它的面数,如果某个选项声称“某个骰子上的所有数字都可能出现”,就要检查在总和约束下这个骰子是否真的能取到它的最小值和最大值。如果取最小值时其他骰子已经超过总和,或者取最大值时其他骰子凑不够总和,那这个选项就是错的。

小猴爬山题给了起始和结束高度、相邻两天高度差不超过 1 的约束,问可能到过的最高海拔。这类题用“先升后降”的模型:从起点开始每天加 1,升到某个峰值后开始下降,保证最后一天回到终点高度。峰值高度受两个条件限制——从起点爬升的天数和从终点倒推的天数。答题时取两个方向上能达到的最高值中的较小者,再和选项比对。

5. 易错点:五类高频失分题的避坑清单

5.1 变量命名题:合法与关键字的边界

错在哪:看到double、case、default这类词觉得“像个变量名”就选了。 为什么错:这些是 C++ 关键字,有特殊语法含义,不能作为变量名。判断合法变量名时要同时满足首字符规则和“不在关键字表里”两条。 怎么答对:拿到题先扫一遍选项,把首字符是数字的划掉,再把眼熟的关键字划掉,剩下的基本就是答案。平时写代码时养成变量名带语义的习惯,考试时对关键字的敏感度会高很多。

5.2 赋值语句题:等号左边必须是变量

错在哪:选项里3 = x;或a + b = c;看起来“像赋值”,犹豫之后选错。 为什么错:赋值语句的左边必须是“可修改的左值”,常量、表达式、带运算符的组合都不能放在等号左边。 怎么答对:先看等号左边,不是单个变量就直接判错。再看右边和分号,字符串赋给字符变量、语句末尾漏分号都是常见错误写法。两步筛完,答案就出来了。

5.3 循环嵌套题:内层循环的边界跟着外层变

错在哪:模拟嵌套循环时,内层循环的上界写成了固定值,没有跟着外层变量走。 为什么错:很多题的内层循环条件是j <= 10000 / i或j < i,内层的边界是动态的。忽略这一点会导致多算或少算循环次数。 怎么答对:模拟前先把每层循环的起止条件写在草稿纸上,标明哪些是变量、哪些是常量。跑第一轮时慢一点,把i和j的每个取值列出来,确认边界后再加速。

5.4 排序比较次数题:最坏情况不是“随便猜”

错在哪:问“最坏情况下需要多少次比较”,凭感觉选了一个接近 ( n^2 ) 的数,没算清楚。 为什么错:简单排序的最坏比较次数是有公式的。冒泡排序和选择排序在最坏情况下都要比较 ( n(n-1)/2 ) 次,插入排序最坏也是这个量级。没记住公式就只能干瞪眼。 怎么答对:记住 ( n(n-1)/2 ) 这个式子,代入 ( n ) 直接算。如果题目给的是具体数字,先把公式写出来再代入,避免心算出错。

5.5 程序阅读题:循环变量的初始值和终止条件

错在哪:看代码时觉得“这个循环就是从 1 到 n”,实际代码写的是i < n或i <= n,差一个边界导致答案差 1。 为什么错:程序阅读题最爱在边界上做文章。<和<=的区别、初始值是 0 还是 1、循环体内有没有提前break,每一个都会改变输出结果。 怎么答对:读代码时拿笔把循环头圈出来,把初始值、终止条件、步长三个要素标清楚。模拟时用一个小一点的输入(比如 ( n=5 ))手动跑一遍,边界问题会立刻暴露。

6. 答题节奏与押题思路:从考场时间分配到复查习惯

这套卷子的题量不小,基础题、程序阅读、问题阅读三块的时间分配建议是 1:1:1,留出最后 10 分钟复查。基础题控制在 15 分钟内做完,不会的先标记跳过;程序阅读题每题给自己 3 到 4 分钟,模拟两轮循环就选答案;问题阅读题读题干时先看问题,带着问题找条件,每道题控制在 5 分钟内。

押题方向上,变量命名、赋值语句合法性、二进制转十进制、约数个数统计、最大公因数与最小公倍数、回文数判断、筛法思想、简单模拟这几类几乎年年出现。复习时不用刷偏题,把这几类的代码亲手敲一遍、改几个边界条件跑一跑,比看十道题都管用。

考场上有一个习惯特别值钱:每道程序阅读题做完后,用题目给的输入值在草稿纸上快速回代一遍,看输出是否和选项对得上。这个动作花不了半分钟,但能拦住大部分“看错边界”的错误。我当年第一次考这类卷子时,就是因为没检查循环的<和<=,白白丢了三分,从那以后每次做程序阅读题都强制自己在草稿纸上标出循环三要素再动笔。希望这些拆解能帮你在预选赛里稳住该拿的分,把精力留给真正拉差距的题。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询