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

选择题 · 答案 129,43 · 考点:顺序结构、运算符与表达式

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

题目

#include <stdio.h>
int main()
{
	int i, p[5], q[5], x, y = 20;
	for ( i = 0; i <= 4; i++ )
		scanf( "%d", &p[i] );
	q[0]	= (p[0] + p[1]) + (p[2] + p[3] + p[4]) / 7;
	q[1]	= p[0] + p[1] / ( (p[2] + p[3]) / p[4]);
	q[2]	= p[0] * p[1] / p[2];
	q[3]	= q[0] * q[1];
	q[4]	= q[1] + q[2] + q[3];
	x	= (q[0] + q[4] + 2) - p[(q[3] + 3) % 4];
	if ( x > 10 )
		y += (q[1] * 100 - q[3]) / (p[p[4] % 3] * 5);
	else
		y += 20 + (q[2] * 100 - q[3]) / (p[p[4] % 3] * 5);
	printf( "%d,%d\n", x, y );
	return(0);
}
/*注:本例中,给定的输入数据可以避免分母为 0 或数组元素下标越界。*/ 

输入:6 6 5 5 3 输出:_______________

答案:129,43

考点

顺序结构运算符与表达式

解题思维

拿到这题别急着敲计算器,先盯着那几行赋值语句看运算符优先级和整数除法的截断特性,把p数组的值代进去,像搭积木一样一层层算出q[0]到q[4],最后再按逻辑分支算x和y,注意p的下标是取模后的结果,千万别算错下标。

常见错误

很多孩子在这儿栽跟头,第一是整数除法理解不透彻,以为13/7等于2,其实C语言里直接截断小数部分,就是1,这会导致q[0]算错,后面全串;第二是算q[1]时容易把括号里的除法算成浮点或者顺序搞反,比如把(5+5)/3当成1.66再除,最后结果不对;第三是算x的时候,下标(p[(q[3]+3)%4])容易看花眼,把q[3]算错或者取模算错,导致去p数组里拿错了数;第四是y的计算分支判断,x=129确实大于10,但分母p[p[4]%3]里的p[4]是3,3%3等于0,所以分母是p[0],这里要是把p[4]当成别的值就会除错;第五是最后加法顺序,很多人把(q[1]*100-q[3])算完直接加20,忽略了前面y初始就是20,这里逻辑没错但容易算成43+20=63之类的低级错误。

详细解析(节选)

考点梳理与命题意图

这道题核心考的是C语言表达式求值规则,特别是整数除法的截断特性(向零取整)、运算符优先级、以及数组下标计算中的取模运算。命题人爱在这种看似复杂的表达式里挖坑,比如故意把除法放在括号里,或者让下标依赖前面算出来的值,这样学生如果只背公式不看优先级,很容易算错。另外,y的计算分两个分支,x>10走一条,x<=10走另一条,这是典型的逻辑陷阱,很多孩子会忽略x的具体值直接套用公式。

输入与数组初始化

输入是6 6 5 5 3,按顺序赋给p[0]到p[4],所以p数组就是:p[0]=6, p[1]=6, p[2]=5, p[3]=5, p[4]=3。y初始值是20,这个后面会加。

逐行计算q数组

先算q[0]:(p[0]+p[1])+(p[2]+p[3]+p[4])/7。前一部分6+6=12,后一部分5+5+3=13,13/7在C语言里是整数除法,13除以7商1余6,直接取1,所以q[0]=12+1=13。这里一定要强调整数除法截断,不是四舍五入也不是向上取整,是直接扔掉小数部分。

再算q[1]:p[0]+p[1]/((p[2]+p[3])/p[4])。先算括号里(p[2]+p[3])=10,10/p[4]=10/3,整数除法得3,所以分母是3,p[1]/3=6/3=2,最后p[0]+2=6+2=8。注意这里的除法是层层嵌套的,括号优先级最高,一定要按顺序来。

q[2]=p[0]*p[1]/p[2]=6*6/5=36/5,整数除法得7。

q[3]=q[0]*q[1]=13*8=104。

q[4]=q[1]+q[2]+q[3]=8+7+104=119。

计算x

x=(q[0]+q[4]+2)-p[(q[3]+3)%4]。先算q[0]+q[4]+2=13+119+2=134。下标部分(q[3]+3)%4=(104+3)%4=107%4,107除以4商26余3,所以下标是3,p[3]=5,因此x=134-5=129。

计算y

判断x>10,129确实大于10,走if分支:y+= (q[1]*100-q[3])/(p[p[4]%3]*5)。先算分子q[1]*100-q[3]=8*100-104=800-104=696。分母p[p[4]%3]*5,p[4]=3,3%3=0,所以p[0]=6,6*5=30。696/30=23(整数除法,23*30=690,余6,直接取23)。y初始20,加上23得43。

输出

printf("%d,%d\n", x, y)输出129,43,与参考答案一致。

易错点再强调

整数除法截断是这道题最大的坑,q[0]里13/7=1,q[2]里36/5=7,q[1]里10/3=3,这些如果当成浮点或者四舍五入,后面全错。还有下标计算,(q[3]+3)%4容易算错,107%4=3不是1,p[3]不是p[1]。分母里的p[p[4]%3],p[4]=3,3%3=0,所以是p[0],不是p[3],这里很多孩子会搞混。

考频与趋势

从题库数据看,运算符与表达式这个考点非常高频,261题覆盖9个级别,2023年突然爆发91题,2025年61题,2026年14题,说明这类题目一直是命题重点,尤其是整数除法和数组下标计算。顺序结构相对少,只有5题,但2007-2010年间考过,说明基础语法题在早期比较集中。结合近年趋势,未来这类题目可能会继续考,但形式可能更复杂,比如多变量嵌套、浮点与整数混合运算,或者结合循环动态计算数组。

预测

基于2023-2026年的高频数据,尤其是2023年91题的爆发,可以预测未来几年运算符与表达式类题目仍会保持高频率,但可能会减少纯填空,增加需要结合循环或条件判断的综合题。例如,给定一段代码,要求计算某个变量的值,或者判断某个条件是否成立。命题人可能会继续用整数除法和数组下标作为陷阱,但会增加多层嵌套,让计算更繁琐。对于顺序结构,由于考频低,未来可能不再单独考,而是融入其他综合题中。

总之,这道题是典型的整数除法+数组下标+条件分支的综合题,掌握这些基本功,再仔细按优先级算,就能稳稳拿分。

同考点真题

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