鱼C论坛

 找回密码
 立即注册
查看: 3018|回复: 8

[已解决]解题了,但感觉效率不高,能给别的思路我再解一次吗?

[复制链接]
发表于 2022-9-19 14:10:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

输入
输入共 1 行,一个整数N。

-1,000,000,000 ≤ N≤ 1,000,000,000。
输出
输出共 1 行,一个整数,表示反转后的新数。
样例输入
样例 #1:
123

样例 #2:
-380
样例输出
样例 #1:
321

样例 #2:
-83


我的代码
n = input()
m = len(n) #长度3

#判断是否为负数,是就先输出-
if int(n) < 0:
    m -= 1
    print('-',end='')

#循环M次,如第一次为0则跳过,每次循环m -1
#循环取值下标为k,k为-1,如果k=-1并且n[k] =0则判断尾数
#循环取值,得到-输出-,得到0并且未曾输出过其他非0数,则f还是0,不作输出,但m k运算
k = -1
f = 0 #是否已经取得第一个非0数
while m:
    if n[k] == '-':
        print('-',end='')
        m -= 1
        k -= 1
    elif int(n[k]) == 0 and f == 0:  #下标-1为0
        m -= 1
        k -= 1
    else:
        print(n[k],end='')
        m -= 1
        k -= 1
        f = 1


代码通过验证没问题,但我觉得又长又臭,总觉得判断负数和尾数为0的时候效率极其低下


请高手们指点一下其他思路,我再想第二个版本的代码

知识点只到 for while  if
最佳答案
2022-9-19 15:13:54
本帖最后由 jackz007 于 2022-9-19 15:22 编辑
jcpython2 发表于 2022-9-19 15:09
老哥你意思是Int有符号会报错?


     看来是我记的有偏差,那就更简单了
e , d , k = int(input('输入一个数:')) , 0 , 1
if e < 0:
    e , k = -e , -k    
while e:
    d = d * 10 + e % 10
    e //= 10
print(k * d)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-19 14:38:36 | 显示全部楼层
本帖最后由 jackz007 于 2022-9-19 14:50 编辑
n = input()
. . . . . .
if int(n) < 0:   # 这个完全没有可能,作为字符串,n 中不允许出现任何非数字字符,否则,int() 的异常会导致脚本意外终止。
x , k = input('输入一个数:') , 1
if x[0] == '-':
    x = x[1:]
    k = -k
d , e = 0 , int(x)
while e:
    d = d * 10 + e % 10
    e //= 10
print(k * d)
        运行实况:
D:\[00.Exerciese.2022]\Python>python x.py
输入一个数:-830
-38

D:\[00.Exerciese.2022]\Python>python x.py
输入一个数:123
321

D:\[00.Exerciese.2022]\Python>python x.py
输入一个数:-100000
-1

D:\[00.Exerciese.2022]\Python>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-19 15:09:55 | 显示全部楼层

老哥你意思是Int有符号会报错?
>>> a = '-1'
>>> int(a)
-1

我这个没报错啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-19 15:13:54 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2022-9-19 15:22 编辑
jcpython2 发表于 2022-9-19 15:09
老哥你意思是Int有符号会报错?


     看来是我记的有偏差,那就更简单了
e , d , k = int(input('输入一个数:')) , 0 , 1
if e < 0:
    e , k = -e , -k    
while e:
    d = d * 10 + e % 10
    e //= 10
print(k * d)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2022-9-19 15:36:54 | 显示全部楼层
jackz007 发表于 2022-9-19 15:13
看来是我记的有偏差,那就更简单了

你的代码简洁有力,同时我完全看不懂,我数学真的太差了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-19 15:43:36 | 显示全部楼层
jcpython2 发表于 2022-9-19 15:36
你的代码简洁有力,同时我完全看不懂,我数学真的太差了

e , d , k = int(input('输入一个数:')) , 0 , 1     # e 是键盘输入的整数,d 是即将得到的反序数,k 是 e 的符号,缺省值是 1
if e < 0:                                          # 如果键入的是负数
    e , k = -e , -k                                # 则对键入的数 e 和符号数 k 取反,则 e 成为正数,k 成为 -1
while e:                                           # 根据 e 循环计算反序数 d
    d = d * 10 + e % 10
    e //= 10
print(k * d)                                       # 计算结果显示成 k * d, 如果 e 本来是负数,则 k = -1,k * d 会是负数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-19 16:15:20 | 显示全部楼层

老哥让你失望了,哪怕你注释了我也完全看不懂

我自己也做了一次逐步输出查看
e , d , k = int(input('输入一个数:')) , 0 , 1
if e < 0:
    e , k = -e , -k    
while e:
    print('e:',e,' d:',d,' k:',k)
    d = d * 10 + e % 10
    print('此时d:',d)
    e //= 10
    print('e//10后: ',e)
    print('-----------------')


print(k,d)
print(k * d)
d = d * 10 + e % 10

核心这句我首先看不明白为啥这样写,是从什么思路得出这段的,或者说你整段代码我都不知道什么思路,我还是停留在逐个逐个小问题解决的地步,甚至解决完我也觉得效率低下。

其中的e % 10和后面的e //= 10我也不懂什么作用

如果说e //= 10最后会得出0停止while,那我就仅限知道除到最后会得到0而已,肤浅到不得了

整段代码完全是超出我认知范围,让我为自己的水平感到绝望,本帖完结,记下不知道多久后才能看懂~哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-19 16:38:44 | 显示全部楼层
本帖最后由 jackz007 于 2022-9-19 16:44 编辑
jcpython2 发表于 2022-9-19 16:15
老哥让你失望了,哪怕你注释了我也完全看不懂

我自己也做了一次逐步输出查看


        考察这个代码
d , e = 0 , 185
while e:
    d = d * 10 + e % 10
    e //= 10
        这个代码根据 e 求取其反序数 d,一共会循环 3 次
第1次循环: d = d * 10 + e % 10 =  0 * 10 + 185 % 10 =   5              e = e // 10 = 185 // 10 = 18
第2次循环: d = d * 10 + e % 10 =  5 * 10 +  18 % 10 =  58              e = e // 10 =  18 // 10 =  1 
第3次循环: d = d * 10 + e % 10 = 58 * 10 +   1 % 10 = 581              e = e // 10 =   1 // 10 =  0
        到最后,e = 0,while e 丧失循环条件,最终,d = 581         
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-20 11:09:31 | 显示全部楼层
jackz007 发表于 2022-9-19 16:38
考察这个代码

        这个代码根据 e 求取其反序数 d,一共会循环 3 次

应该算是弄懂了
d = d * 10 + e % 10

以185为例

思路是 利用 【任何数%10都得他的个位数】求出个位数 5

并且将原数据185 //10 理论上砍掉5留18带入循环,18为非0,while 则为True


然后第二次循环*10 让个位数5 进一位 即5→50


并且再次在循环中求出数据的个位数,此时数值是上个循环中 185 //10留下的 18,所以取8

整体循环思路是

去个位数→进一位→取个位数→进一位,达到数据逆序的排列


最后控制整体循环次数的  185 // 10 原理是不断削减个位数,达到循环流中数值个位数不停更替的原理

并且最后只剩下个位数的时候//10必然得0,即任何个位数除以10都得0,达到循环false的功能


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-10 17:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表