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

选择题 · 答案 8 · 考点:循环结构

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

题目

#include <stdio.h>
int main()
{
	int a, b, i, tot, c1, c2;
	scanf( "%d%d", &a, &b );
	tot = 0;
	for ( i = a; i <= b; i++ )
	{
		c1	= i / 10;
		c2	= i % 10;
		if ( (c1 + c2) % 3 == 0 )
			tot++;
	}
	printf( "%d\n", tot );
	return(0);
}

输入:7 31 输出:_________

答案:8

考点

循环结构

解题思维

这题就是让你当个‘人工编译器’,把那段 for 循环在纸上跑一遍。从 a 到 b 逐个取数,拆出十位和个位,加起来看能不能被 3 整除,能就计数。别一上来就背结论,模拟才是王道。

常见错误

最容易栽跟头的地方有两处:一是把十位和个位搞混,比如把 31 当成十位 3、个位 1,然后误以为 3+1=4 不能被 3 整除就漏掉,或者反过来把个位当十位算;二是边界条件,很多人看到 31 就顺手数进去,其实 31 的十位 3 加个位 1 等于 4,4%3=1,不满足条件,必须剔除。还有少数人会纠结 7 到 11 这几个数,其实它们的十位都是 0,0+个位分别是 7,8,9,10,11,只有 9 能被 3 整除,但 9 不在 7~31 范围内吗?等等,9 在范围内啊,十位是 0,个位是 9,0+9=9,9%3=0,应该算进去!这里有个陷阱:题目里的循环是从 a 到 b,a=7,b=31,所以 9 确实会被遍历到。但是代码里 c1=i/10,当 i=9 时,c1=0,c2=9,0+9=9,9%3=0,满足条件,所以 9 应该被计入。那为什么正确答案是 8 而不是 9?让我们重新检查一下:7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31。其中满足条件的有:9(0+9=9),12(1+2=3),15(1+5=6),18(1+8=9),21(2+1=3),24(2+4=6),27(2+7=9),30(3+0=3)。一共 8 个。所以 9 确实应该被计入,但为什么答案是 8?哦,我明白了,9 的十位是 0,个位是 9,0+9=9,9%3=0,满足条件,应该计入。那为什么答案是 8?让我再仔细数一遍:9,12,15,18,21,24,27,30。一共 8 个。没错,9 是其中之一,所以总数是 8。那为什么有人会觉得 9 不该计入?可能是因为 9 的十位是 0,他们误以为 0 不算数字,或者他们把 9 当成了个位数,没有考虑十位。总之,9 必须计入,所以答案是 8。

详细解析(节选)

考点与命题视角

这道题考查的是循环结构的模拟执行与取整/取余运算的实际意义。命题人不会让你背公式,而是给你一段看似简单的代码,让你当“人工编译器”——把程序在纸上一步步跑一遍,看看它到底做了什么。

为什么这么考?因为很多同学在看到 i/10 和 i%10 时,脑子里只想到“整除”和“取余”这两个数学概念,却忽略了它们在十进制数中的实际含义:i/10 就是十位上的数字,i%10 就是个位上的数字。命题人就是在这里挖坑:如果你只记公式,就会在判断条件时出错;只有真正理解运算背后的语义,才能正确解题。

人话讲清概念

同考点真题

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