把整数 N 拆成符号与数位串,r = r * 10 + n % 10 循环反转数位,符号最后乘回,O(d) 完成。
OJ: roj
题目 ID: 1089
难度:入门
标签:入门字符串模拟python
创建: 2026-09-29 18:17
更新: 2026-10-05 00:41
题目描述
给定一个整数 N(-1,000,000,000 ≤ N ≤ 1,000,000,000),把它各个位上的数字反转得到一个新数,符号不变,最高位的零要去掉。输入一行整数 N,输出一行反转后的整数。
样例:输入 123 输出 321;输入 -380 输出 -83。
思路
把符号单独摘出来,只对 |N| 的数位做反转:循环 r = r * 10 + n % 10; n /= 10;,末位的 0 自然不会进入结果,正好满足"去前导零"的要求;最后把符号乘回去,N 为 0 时循环不执行、结果就是 0。
参考代码
Python 版:
python
#!/usr/bin/env python3
# Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
# rbook: -> https://rbook.roj.ac.cn https://rbook2.roj.ac.cn
# rainboy的学习导航网站: https://idx.roj.ac.cn
# create_at: 2026-09-29 18:18
# update_at: 2026-09-29 18:18
import sys
def solve() -> None:
value = int(sys.stdin.buffer.read())
sign = "-" if value < 0 else "" # 负号永远留在最高位,先单独摘出来
digits = str(abs(value)) # 去掉符号后的数字串,不含前导零
# 反转数位;原数末尾的 0 现在跑到最前面,lstrip("0") 抹掉它们,
# 但原数本身是 0 时整串会被抹空,此时要还原成 "0"。
reversed_digits = digits[::-1].lstrip("0") or "0"
print(sign + reversed_digits)
if __name__ == "__main__":
solve()C++ 版(同一算法):
cpp
/**
* Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
* rbook: -> https://rbook.roj.ac.cn https://rbook2.roj.ac.cn
* rainboy的学习导航网站: https://idx.roj.ac.cn
* create_at: 2026-10-04 22:30
* update_at: 2026-10-05 00:41
*/
// main.cpp:把整数 N 的数位顺序反转;负号不参与反转,末尾零反转后的前导零会被自然丢弃。
#include <cstdio>
typedef long long ll;
int main() {
ll n;
scanf("%lld", &n);
// 负号单独摘出来,反转只对 |n| 的数位做,最后拼回去。
ll sign = (n < 0) ? -1 : 1;
ll v = (n < 0) ? -n : n;
// 数位反转:r = r * 10 + v % 10,再把 v 砍掉最低位;末位 0 自然不会进入 r。
ll r = 0;
while (v > 0) {
r = r * 10 + v % 10;
v /= 10;
}
// N == 0 时循环没跑,r 仍是 0,正好符合题面"原数为零则结果为零"。
printf("%lld\n", sign * r);
return 0;
}