进阶 · 数位

反转数字

读一个正整数,把它倒着打印:1234 变 4321。拆位模式配上"组装新数字" — 还藏着一个末尾零的细节。

一句话答案一边拆位一边用 rev = rev * 10 + n % 10 重建,把 N 倒过来 —— 末尾的 0 会自然消失,所以 1200 反过来是 21 而不是 0021。

题目

输入: 一个正整数 N(1 ≤ N ≤ 10⁹)。

输出: N 的数字倒序(前导零自然消失:1200 的反转是 21)。

样例:

输入输出
12344321
120021

你的解答

main.cpp — 你的解答
「运行我的输入」用的自定义输入

判题在浏览器本地运行。死循环会在 3 秒后被自动中断 —— 但还是确保每个循环都有出口。代码随打随存。

卡住了?提示

提示 1 — 弹出与压入

每圈两个动作:弹出 n 的末位(n % 10),压进结果:rev = rev * 10 + digit;,然后 n /= 10;。在纸上跟踪 1234:rev 依次是 4 → 43 → 432 → 4321。

提示 2 — 为什么 1200 变 21

弹出的数字是 0 时,rev * 10 + 0 只是延长 rev — 但结束时 0021 作为一个数就是 21。整数不存前导零;想保留就得用文本(那是另一道题)。

题解(先自己试试!)
#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;
    int rev = 0;
    while (n > 0) {
        rev = rev * 10 + n % 10;
        n /= 10;
    }
    cout << rev << endl;
    return 0;
}

和数一数位数同一个骨架,多一行。这个模式还能变出:回文数判断、数字和、"幸运数" — 全是弹压组合。下一题:回文数。

深度解析

为什么这样做对

rev = rev * 10 + n % 10 正好是剥位的逆运算。一剥一拼合起来,就是「把数字当字符串处理」的完整工具。

代价

O(d) 时间、O(1) 空间,不需要数组。

常见错法

  • 1200 反转是 21 而不是 0021:末尾的零变成整数的前导零,直接消失。
  • 反转 1000000009 会溢出 int。即使输入装得下,反转后的值也可能装不下。

下一步

拿反转结果去比较:回文数。

记住这两句

  • rev = rev * 10 + 位 就是逐位构造一个数。
  • 反转可能溢出,哪怕输入本身不溢出。
🐞 这段是错的 —— 点开,亲手让它挂一次

只把各位加起来,没有左移一位

#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;
    int rev = 0;
    while (n > 0) {
        rev = rev + n % 10;
        n /= 10;
    }
    cout << rev << endl;
    return 0;
}