纯萌新,个人见解,如有错误希望大佬不吝指教。
对于正数来说,逐步得到每一位可以:
k=1234
while k!=0:
x=k%10
k//=10
print(x)
'''
4
3
2
1
'''
对于负数来说,就不能和求正数一样的办法了,会得到错到离谱的结果。
k=-1234
while k!=0:
x=k%10
k//=10
print(x)
'''
6
6
7
8
9
9
9
9
9
9
9
...........
'''
首先,这里我们要知道一下取模和取余的区别:
python中的%号是进行取模操作而非取余操作。那么通过取模是无法得到每个数位上的数的。那么就要通过自己想办法写出取余的函数。
对于同符号数取模和取余一样;对于异符号数,取余的商趋向0,取模的商趋向负无穷。
#对于同符号数取模取余一样的
#取余函数
def rem(n):
k=int(n/10)
r=n-k*10
return r
#118与10一样是正数
print(rem(118)) #取余 8
print(118%10) #取模 8
#-118和10是异符号数
print(rem(-118)) #-8
print(-118%10) #2
其次,我们就能引出求商时的“除数//被除数”和int(除数/被除数)的区别了:
同样的,对于同符号数两者无区别;对于异符号数,这就是上面说到的
对于同符号数取模和取余一样;对于异符号数,取余的商趋向0,取模的商趋向负无穷。
#同符号数
print(118//10) #11
print(int(118/10)) #11
#异符号数
print(-118//10) #-12
print(int(-118/10)) #-11
#尤其是负数取到最后一位时甚至商根本就不能为0,要是设置循环条件是k!=0的话还会死循环
print(-1//10) #-1
print(int(-1/10)) #0
因为实际上取模函数和取余函数自己写的话如下:
# 取模,Python中可直接用%,计算模,r = a % b
def mod(a, b):
c = a // b #使得商趋向负无穷
r = a - c * b
return r
# 取余
def rem(a, b):
c = int(a / b) #使得商趋向0
r = a - c * b
return r
可见取模和取余函数的区别就在于对商值的不同求法。
搞清这个问题以后,我们就可以知道为什么负数在逐步取出数位上的数时会出现错误了。关键就在于:
- 我们要得到的是余数,但是python自带的%号提供的是取模,这样在异符号数计算时就会出现错误
- 同时每次得到一位后的商,异符号数计算时也会出错
那么我们最终只要将上述的问题一一解决就可以实现正负数的取数位问题了
def rem(n):
k=int(n/10)
r=n-k*10
return r
n=int(input()) #输入处理数
while n!=0:
k=rem(n) #得到余数
n=int(n/10) #每次之后得到正确的商
print(k)
#输入样例:-257
#输出:
-7
-5
-2