NOIP 提高组初赛 · NOIP 2008 提高组初赛试题 第 23 题

选择题 · 答案 23 · 考点:运算符与表达式、顺序结构、一维数组

← 整套速查表 NOIP 提高组初赛 全部真题

题目

#include<iostream>
	using namespace std;
	int main()
	{
		int i, a, b, c, d, f[4];
		for(i = 0; i < 4; i++) cin >> f[i];
		a = f[0] + f[1] + f[2] + f[3];
		a = a / f[0];
		b = f[0] + f[2] + f[3];
		b = b / a;
		c = (b * f[1] + a) / f[2];
		d = f[(b / c ) % 4];
		if(f[(a + b + c + d) % 4] > f[2])
			cout << a + b<< endl;
		else cout << c + d << endl;
		return 0;
}

输入:9 19 29 39 输出:_______________

答案:23

考点

运算符与表达式顺序结构一维数组

解题思维

拿到这种程序填空或阅读题,别急着敲计算器。先给数组 f 标上值,按代码顺序一行一行‘过电影’,把每一次赋值后的变量值记下来,最后看条件分支走哪条路。

常见错误

最大的坑就是整数除法。很多学生看到 96/9 下意识想 10.66,或者用四舍五入,结果 a 就错了,后面 b、c、d 全歪。还有取模运算里如果中间结果算错,下标越界也是常事。另外条件判断里 f[(a+b+c+d)%4] 这个下标别算错,很多人会漏掉括号优先级,把加法先算完再取模,其实这里就是先求和再取模,但重点还是整数除法截断。

详细解析(节选)

这道题表面看是段代码阅读,核心其实就考三个点:C++ 整数除法的截断规则、一维数组下标计算、以及条件分支的逻辑判断。命题人爱在整数除法这里挖坑,因为学生容易用数学上的除法思维去套,忘了 C++ 里两个 int 相除直接舍去小数部分。顺序结构虽然简单,但变量依赖链很长,一步错后面全错,所以必须严格按执行流推演。

现在输入是 9 19 29 39,先读入数组:f[0]=9, f[1]=19, f[2]=29, f[3]=39。接下来看 a 的计算:a 先等于四个数之和,9+19+29+39=96。然后 a=a/f[0],也就是 96/9。这里一定要用整数除法,96÷9=10 余 6,截断后 a=10。很多同学会算成 10.66 或者四舍五入成 11,那就错了。

接着算 b:b=f[0]+f[2]+f[3]=9+29+39=77。然后 b=b/a,也就是 77/10。同样整数除法,77÷10=7 余 7,截断后 b=7。这一步如果 a 算错了,b 肯定也跟着错。

再看 c:c=(b*f[1]+a)/f[2]。先算分子:b*f[1]=7*19=133,加上 a=10,得到 143。分母是 f[2]=29。143/29 整数除法是 4 余 27,所以 c=4。这里容易把乘法优先级搞错,或者忘记加 a,导致分子算成 133 直接除以 29 得到 4,虽然结果碰巧一样,但逻辑上必须把 a 加进去。

然后算 d:d=f[(b/c)%4]。先算 b/c=7/4=1(整数除法),再 1%4=1,所以取 f[1]=19,d=19。这一步下标计算是重点,很多人会先算 b/c 的余数,或者忘记取模,导致下标跑到 f[2] 或 f[3] 去。

现在所有变量都有了:a=10, b=7, c=4, d=19。接下来看条件判断:if(f[(a+b+c+d)%4] > f[2])。先算括号里的和:10+7+4+19=40。40%4=0,所以取 f[0]=9。然后比较 9 > f[2],也就是 9 > 29,显然不成立。条件为假,走 else 分支,输出 c+d=4+19=23。

整个过程就是按代码顺序一步步代入,每一步都注意整数除法的截断和下标计算。命题人喜欢在中间变量依赖链上设陷阱,比如 a 算错导致 b 错,或者 c 的分子漏加 a 导致 c 错,进而影响 d 的下标。所以做题时一定要把每一步的值都写清楚,不要跳步。

从考频数据来看,‘运算符与表达式’这个知识点在题库里一共考了 261 题,覆盖从 2007 到 2026 的所有级别,其中 2023 年考了 91 题,2024 年 41 题,2025 年 61 题,2026 年 14 题,说明这类题目近几年依然是高频考点,尤其是整数除法和取模运算的结合。‘一维数组’考了 224 题,2023 年 27 题,2024 年 48 题,2025 年 55 题,2026 年 59 题,增长趋势很明显,数组下标计算和结合运算符的题目越来越常见。‘顺序结构’虽然只考了 5 题,但主要集中在 2008-2010 年,近几年较少单独考,但作为基础逻辑依然重要。

基于这些数据,未来这类题目大概率会继续出现在 NOIP 提高组初赛和 CSP 提高级中,形式可能更加复杂,比如增加多层嵌套的条件判断,或者在数组下标里加入更复杂的表达式。但核心还是整数除法的截断规则和数组下标计算,这些是基础中的基础,必须扎实。

总之,这道题的答案就是 23,关键在于严格按代码执行流推演,每一步都注意整数除法的截断和下标计算,不要掉进命题人设的坑里。

同考点真题

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断