数字反转

GitHub跳转原题关系图返回列表

把整数 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;
}