阅读程序 · 答案 99 101 111 · 考点:循环结构、运算符与表达式、基础算法、数列基础
← 整套速查表 NOIP 普及组初赛 全部真题阅读程序写结果:
#include <iostream>
using namespace std;
int rSum(int j)
{
int sum = 0;
while (j != 0) {
sum = sum * 10 + (j % 10);
j = j / 10;
}
return sum;
}
int main()
{
int n, m, i;
cin>>n>>m;
for (i = n; i < m; i++)
if (i == rSum(i))
cout<<i<<' ';
return 0;
}输入: 90 120
这题本质是找回文数,但命题人把‘回文数’包装成‘函数自相等’,让你先读懂rSum(j)怎么把整数j的各位数字反转,再在90~120里逐个试,遇到rSum(i)==i就输出。
最容易错在把rSum当成普通累加或乘法,忽略‘先取个位再乘10加回去’的循环结构,导致100被算成100(正确是1)、101被算成101(正确是101)但中间过程写错;还有人会漏掉99,以为90~100之间没有回文数;另外循环边界i<n还是i<=n也容易搞混,题目是i<n,所以90要参加判断,120不参加。
这是一道典型的“阅读程序写结果”题,核心考点是运算符与表达式里的整数运算(%和/)以及循环结构里的顺序执行。命题人把“回文数”这个概念包装成“一个函数把整数反转后,反转结果等于原数”,让你先读懂函数,再在给定区间里找满足条件的数。
int rSum(int j)
{
int sum = 0;
while (j != 0) {
sum = sum * 10 + (j % 10);
j = j / 10;
}
return sum;
}这段代码做的是把整数j的各位数字反转。我们一步步看:
1. sum初始为0。 2. 进入while,只要j不为0就继续。 3. j % 10取出j的个位数字。 4. sum = sum * 10 + (j % 10)把原来的sum左移一位(乘10),然后加上新的个位,相当于把刚才取出的数字拼到sum末尾。 5. j = j / 10把j的个位去掉,准备下一次循环。
举个例子,rSum(123):
sum = 0*10 + 3 = 3,j变成12sum = 3*10 + 2 = 32,j变成1sum = 32*10 + 1 = 321,j变成0,循环结束返回321,正好是123的反转。