鱼C论坛

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

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

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

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

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

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

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

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

  11. 样例 #2:
  12. -380
  13. 样例输出
  14. 样例 #1:
  15. 321

  16. 样例 #2:
  17. -83
复制代码



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

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

  7. #循环M次,如第一次为0则跳过,每次循环m -1
  8. #循环取值下标为k,k为-1,如果k=-1并且n[k] =0则判断尾数
  9. #循环取值,得到-输出-,得到0并且未曾输出过其他非0数,则f还是0,不作输出,但m k运算
  10. k = -1
  11. f = 0 #是否已经取得第一个非0数
  12. while m:
  13.     if n[k] == '-':
  14.         print('-',end='')
  15.         m -= 1
  16.         k -= 1
  17.     elif int(n[k]) == 0 and f == 0:  #下标-1为0
  18.         m -= 1
  19.         k -= 1
  20.     else:
  21.         print(n[k],end='')
  22.         m -= 1
  23.         k -= 1
  24.         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有符号会报错?


     看来是我记的有偏差,那就更简单了
  1. e , d , k = int(input('输入一个数:')) , 0 , 1
  2. if e < 0:
  3.     e , k = -e , -k   
  4. while e:
  5.     d = d * 10 + e % 10
  6.     e //= 10
  7. print(k * d)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-9-19 14:38:36 | 显示全部楼层
本帖最后由 jackz007 于 2022-9-19 14:50 编辑
  1. n = input()
  2. . . . . . .
  3. if int(n) < 0:   # 这个完全没有可能,作为字符串,n 中不允许出现任何非数字字符,否则,int() 的异常会导致脚本意外终止。
复制代码
  1. x , k = input('输入一个数:') , 1
  2. if x[0] == '-':
  3.     x = x[1:]
  4.     k = -k
  5. d , e = 0 , int(x)
  6. while e:
  7.     d = d * 10 + e % 10
  8.     e //= 10
  9. print(k * d)
复制代码

        运行实况:
  1. D:\[00.Exerciese.2022]\Python>python x.py
  2. 输入一个数:-830
  3. -38

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

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

  10. D:\[00.Exerciese.2022]\Python>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

老哥你意思是Int有符号会报错?

  1. >>> a = '-1'
  2. >>> int(a)
  3. -1
复制代码


我这个没报错啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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


     看来是我记的有偏差,那就更简单了
  1. e , d , k = int(input('输入一个数:')) , 0 , 1
  2. if e < 0:
  3.     e , k = -e , -k   
  4. while e:
  5.     d = d * 10 + e % 10
  6.     e //= 10
  7. print(k * d)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

你的代码简洁有力,同时我完全看不懂,我数学真的太差了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

  1. e , d , k = int(input('输入一个数:')) , 0 , 1     # e 是键盘输入的整数,d 是即将得到的反序数,k 是 e 的符号,缺省值是 1
  2. if e < 0:                                          # 如果键入的是负数
  3.     e , k = -e , -k                                # 则对键入的数 e 和符号数 k 取反,则 e 成为正数,k 成为 -1
  4. while e:                                           # 根据 e 循环计算反序数 d
  5.     d = d * 10 + e % 10
  6.     e //= 10
  7. print(k * d)                                       # 计算结果显示成 k * d, 如果 e 本来是负数,则 k = -1,k * d 会是负数
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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


  11. print(k,d)
  12. print(k * d)
复制代码

  1. d = d * 10 + e % 10
复制代码


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

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

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

整段代码完全是超出我认知范围,让我为自己的水平感到绝望,本帖完结,记下不知道多久后才能看懂~哈哈
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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


        考察这个代码
  1. d , e = 0 , 185
  2. while e:
  3.     d = d * 10 + e % 10
  4.     e //= 10
复制代码

        这个代码根据 e 求取其反序数 d,一共会循环 3 次
  1. 第1次循环: d = d * 10 + e % 10 =  0 * 10 + 185 % 10 =   5              e = e // 10 = 185 // 10 = 18
  2. 第2次循环: d = d * 10 + e % 10 =  5 * 10 +  18 % 10 =  58              e = e // 10 =  18 // 10 =  1
  3. 第3次循环: d = d * 10 + e % 10 = 58 * 10 +   1 % 10 = 581              e = e // 10 =   1 // 10 =  0
复制代码

        到最后,e = 0,while e 丧失循环条件,最终,d = 581         
小甲鱼最新课程 -> https://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的功能


小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-26 18:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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