NOIP 普及组初赛 · NOIP 2010 普及组初赛试题 第 24 题

阅读程序 · 答案 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

答案:99 101 111

考点

循环结构运算符与表达式基础算法数列基础

解题思维

这题本质是找回文数,但命题人把‘回文数’包装成‘函数自相等’,让你先读懂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不参加。

详细解析(节选)

这题考什么

这是一道典型的“阅读程序写结果”题,核心考点是运算符与表达式里的整数运算(%和/)以及循环结构里的顺序执行。命题人把“回文数”这个概念包装成“一个函数把整数反转后,反转结果等于原数”,让你先读懂函数,再在给定区间里找满足条件的数。

知识点人话版

rSum函数在干嘛

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):

返回321,正好是123的反转。

同考点真题

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