Python负数求模运算

在StackOverflow看到一个问题,

即从一个列表中取出一个数,如果这个数小于0,则循环加1.5,直到它大于0。抛去上述代码中的错误不说,有个大神给了代码,其中一行是:

y[i] %= 1.5

做了几个测试:

可以看出结果是对的,but why?

去查负数求模,看到这个,https://blog.csdn.net/hk2291976/article/details/52775299

可知,在Python中,对于给定的数a,对q取余数r,令

a = nq+r \ ,(n = \left \lfloor \frac{a}{q} \right \rfloor)

r = a - n * q \ ,( n = \left \lfloor \frac{a}{q} \right \rfloor )

当n为负数时向下取整的绝对值要比为正数时大一,如 1.2向下取整为1,-1.2向下取整为2。

而前面对一个负数加1.5直到大于0,相当于做了

x = ( \left | \left \lceil \frac{a}{q} \right \rceil \right | +1) * q - \left | a \right | \ , a < 0 \\ = a - (\left \lceil \frac{a}{q} \right \rceil - 1) * q \ , a < 0 \\ = a - (\left \lfloor \frac{a}{q} \right \rfloor) * q \ , a < 0 \\ = r

以 -4 为例,结果 x = -4 + 1.5 + 1.5 + 1.5 = -4 + 3 * 1.5 = -4 + (4//1.5 + 1) * 1.5 = -4 - (-4//1.5)*1.5, (整除都是向下取整)

结论:对一个负数a循环加q直到a非负时,可以直接令 a = a % q

 

叙述有点乱

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值