进阶 · 数位
反转数字
读一个正整数,把它倒着打印:1234 变 4321。拆位模式配上"组装新数字" — 还藏着一个末尾零的细节。
一句话答案一边拆位一边用 rev = rev * 10 + n % 10 重建,把 N 倒过来 —— 末尾的 0 会自然消失,所以 1200 反过来是 21 而不是 0021。
题目
输入: 一个正整数 N(1 ≤ N ≤ 10⁹)。
输出: N 的数字倒序(前导零自然消失:1200 的反转是 21)。
样例:
| 输入 | 输出 |
|---|---|
1234 | 4321 |
1200 | 21 |
你的解答
「运行我的输入」用的自定义输入
判题在浏览器本地运行。死循环会在 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;
}