横跨五年的"洛谷P5705[深基2.例7]数字反转"题解

正好卡在2025年情人节前夕,突发奇想打开了许久未看的洛谷,想看看里面的算法题,然后发现了一道在几年前有多次提交记录的题
P5705 【深基2.例7】数字反转

P5705 【深基2.例7】数字反转

题目描述

输入一个不小于 $100$ 且小于 $1000$,同时包括小数点后一位的一个浮点数,例如 $123.4$ ,要求把这个数字翻转过来,变成 $4.321$ 并输出。

输入格式

一行一个浮点数

输出格式

一行一个浮点数

输入输出样例 #1

输入 #1

1
123.4

输出 #1

1
4.321

2020年4月的题解

1
2
3
4
5
6
7
8
num = float(input())
x = int(num)
a,b,c = str(x)
da = num - x
db = round(da,1)
d = int(db*10)
end = str(d)+"."+str(c)+str(b)+str(a)
print(end)

不知道当时的自己是处于什么精神状态写下来这段屎….

直接拉出来DeepSeek解释吧:

这段代码的目的是将一个浮点数进行处理,生成一个新的字符串。具体步骤如下:

  1. 输入处理:用户输入一个浮点数。
  2. 整数部分提取:将浮点数转换为整数,提取整数部分。
  3. 小数部分提取:用浮点数减去整数部分,得到小数部分。
  4. 整数部分反转:将整数部分转换为字符串并反转。
  5. 小数部分处理:将小数部分四舍五入到一位小数,并提取小数点后的第一位数字。
  6. 结果拼接:将处理后的小数部分和反转后的整数部分拼接成一个新的字符串。

转念一想,就这样提交上去肯定不行啊,所以我又在今天添加了新的题解

2025年2月的题解

刚开始我是这样写的

1
2
3
num=list(input())
for i in range(0,len(num)):
print(num[-1-i],end="")

满怀信心的提交,期待看到绿色的AC
结果只能WA的一声哭出来
1

经历了各种微调,都没发现问题所在,上头的我直接用C怼了上去

1
2
3
4
5
6
7
8
#include <stdio.h>

int main(){
char a,b,c,d;
scanf("%c%c%c.%c",&a,&b,&c,&d);
printf("%c.%c%c%c",d,c,b,a);
return 0;
}

接着有一瞬间感觉不对劲,为什么c用的是%c
在重新阅读题解之后,我发现题目要求明确写了:
2

输出格式
一行一个浮点数

所以我把代码改成了

1
2
3
num = list(input())
for i in range(len(num)):
print(float(num[-1 - i]))

不出预料的,Accepted

进一步优化

既然已经成功 AC 了,接下来就要考虑如何让代码更简洁、优雅。本来我是打算参考题解中大佬的解法的,但是点进去翻找半天并没有Python的高级解法。
Python 作为一门强调简洁的语言,肯定能写出更短的版本。于是我开始琢磨——有没有办法减少循环,甚至去掉list()这个转换

首先,我想到 Python 字符串本身是可迭代的,不需要转换成 list 也能按索引访问。这样num = list(input())其实可以直接写成:

1
num = input()

这样就少了一步转换操作

然后,for i in range(len(num))只是为了遍历num的每一位并倒序输出,其实 Python 早就有内置方法能更优雅地做到这一点,比如[::-1]这个切片操作,就可以直接反转字符串
于是,代码可以进一步缩短成这样:

1
print(float(input()[::-1]))

其实我们还可以利用Lambda 函数map让代码更 牛逼高级 一些

1
(lambda x: print(float(x[::-1])))(input())

这段代码的核心仍然是x[::-1]进行字符串反转,并用float()转换格式,最后用lambda使其成为匿名函数,直接处理输入并打印结果

虽然代码变得更炫了,但其实并没有提升效率,甚至降低了可读性😂
如果存在实际应用的情况,还是推荐原版的

1
print(float(input()[::-1]))

横跨五年的"洛谷P5705[深基2.例7]数字反转"题解
http://blog.luckysix.cc/2025/02/13/横跨五年的洛谷P5705-深基2-例7-数字反转题解/
作者
Thanatos
发布于
2025年2月13日
许可协议