P1307 [NOIP 2011 普及组] 数字反转 (洛谷)

592 字
3 分钟
P1307 [NOIP 2011 普及组] 数字反转 (洛谷)

题目描述#

给定一个整数 NN,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零(参见样例 2)。

输入格式#

一个整数 NN

输出格式#

一个整数,表示反转后的新数。

输入输出样例 #1#

输入 #1#

123

输出 #1#

321

输入输出样例 #2#

输入 #2#

-380

输出 #2#

-83

说明/提示#

【数据范围】

1,000,000,000N1,000,000,000-1,000,000,000\leq N\leq 1,000,000,000

noip2011 普及组第一题


题解与分析#

解题突破口

反转数字最核心的处理在于去除前导(反转后的)零以及保留负号

**数学计算法:**在 C++ 中,直接利用整数的 / 10% 10 操作可以非常优雅地从低位向高位提取数字。当我们在新变量 res 中通过 res = res * 10 + n % 10 进行反转累加时,原数末尾的 0 会被计算为 res * 10 + 0,由于初始 res 为 0,前置的 0 也就自然消失了。此外,C++ 的 % 对负数运算会保留负号(例如 -123 % 10 = -3),因此负数问题也迎刃而解!

复杂度分析

  • 时间复杂度: O(log10N)\mathcal{O}(\log_{10} N),循环次数仅与数字的位数相关,最大 10 位数只需循环 10 次。
  • 空间复杂度: O(1)\mathcal{O}(1),仅需常数级的额外变量存储反转后的数值。

代码实现#

C++ 版本 (数学位运算法)#

#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int res = 0;
while (n != 0) {
res = res * 10 + n % 10; // 提取最后一位并累加到反转结果中
n /= 10; // 削去最后一位
}
cout << res << endl;
return 0;
}

Python 版本 (字符串切片法)#

对于 Python,更“Pythonic”的做法是直接将数字视作字符串处理。利用切片反转字符串后,使用内置的 int() 转换,系统会自动帮你吃掉多余的前导零,省去了大量的繁琐判断。

n_str = input().strip()
if n_str == '0':
print(0)
elif n_str[0] == '-':
# 如果是负数,提取除负号外的所有字符,反转后转成 int 消除前置0,再补充负号
print('-' + str(int(n_str[1:][::-1])))
else:
# 正数直接反转,转为 int 消除前置0后输出
print(int(n_str[::-1]))
分类
标签
站点统计
文章
14
分类
4
标签
24
总字数
23,486
运行时长
0
最后活动
0 天前

文章目录