解题了,但感觉效率不高,能给别的思路我再解一次吗?
描述给定一个整数,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零(参见样例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 =0则判断尾数
#循环取值,得到-输出-,得到0并且未曾输出过其他非0数,则f还是0,不作输出,但m k运算
k = -1
f = 0 #是否已经取得第一个非0数
while m:
if n == '-':
print('-',end='')
m -= 1
k -= 1
elif int(n) == 0 and f == 0:#下标-1为0
m -= 1
k -= 1
else:
print(n,end='')
m -= 1
k -= 1
f = 1
代码通过验证没问题,但我觉得又长又臭,总觉得判断负数和尾数为0的时候效率极其低下
请高手们指点一下其他思路,我再想第二个版本的代码
知识点只到 for whileif 本帖最后由 jackz007 于 2022-9-19 14:50 编辑
n = input()
. . . . . .
if int(n) < 0: # 这个完全没有可能,作为字符串,n 中不允许出现任何非数字字符,否则,int() 的异常会导致脚本意外终止。
x , k = input('输入一个数:') , 1
if x == '-':
x = x
k = -k
d , e = 0 , int(x)
while e:
d = d * 10 + e % 10
e //= 10
print(k * d)
运行实况:
D:\\Python>python x.py
输入一个数:-830
-38
D:\\Python>python x.py
输入一个数:123
321
D:\\Python>python x.py
输入一个数:-100000
-1
D:\\Python> jackz007 发表于 2022-9-19 14:38
运行实况:
老哥你意思是Int有符号会报错?
>>> a = '-1'
>>> int(a)
-1
我这个没报错啊 本帖最后由 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) jackz007 发表于 2022-9-19 15:13
看来是我记的有偏差,那就更简单了
你的代码简洁有力,同时我完全看不懂,我数学真的太差了{:9_230:} 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 会是负数 jackz007 发表于 2022-9-19 15:43
老哥让你失望了,哪怕你注释了我也完全看不懂
我自己也做了一次逐步输出查看
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而已,肤浅到不得了
整段代码完全是超出我认知范围,让我为自己的水平感到绝望,本帖完结,记下不知道多久后才能看懂~哈哈 本帖最后由 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 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的功能
{:10_285:} {:10_285:} {:10_285:} {:10_266:}
页:
[1]