python中整数除法的正负号

来源:互联网 发布:c语言动画代码大全 编辑:程序博客网 时间:2024/05/17 22:26
先看下面几个小题目:其中符号“//”表示除法结果的整数部分(即3/2=1.5,但3//2=1),“%”表示取余数。
(1)7//3 和 7%3 的结果是什么?
(2)7//-3 和 7%-3 的结果是什么?
(3)-7//3 和 -7%3的结果是什么?
(4)-7//-3 和 -7%-3 的结果是什么?

来看一下运算结果:
(1)7//3 = 2,  7%3 = 1
     这个没什么好说的,会做除法的都知道。

(2)7//-3 = -3,  7%-3 = -2
     疑问:为什么不是这样的结果:7//-3 = -2, 7%-3 = 1 (C语言里面是这个结果)

(3)-7//3 = -3,  -7%3 = 2
     疑问:为什么不是这样的结果:-7//3 = -2,  -7%3 = -1 (C语言里面是这个结果)

(4)-7//-3 = 2, -7%-3 = -1
     这个也没什么太大问题,而且C语言里面也是这样的。

现在问题出来了,如果除数和被除数同为正数或者同为负数,结果没有什么争议(最起码我这没有)。但是如果除数和被除数正负号不同,那么python和c里面的计算结果就出现差异了,怎么理解呢?

我个人更喜欢python的计算结果(好吧,我不知道有没有什么标准来规定这个,但是就目前来说,我还是更喜欢python的结果,因为我理解起来更容易一些)。下面是我的一点想法:

这样来看,a 除以 b (我一向分不清除以、除、被除数、除数神马的,反正我这说的就等于C里面的a/b):
这个题目的意义就是,计算数字a里面包含有多少个b,我觉得这就是除法的意义。
那么余数的概念就可以引申出来了,如果a并不是b的整数倍,那么除法之后肯定会有剩余的,也就是余数。

假设a有这么大:
a:  |-----------------------------------------------------------------------------------|
然后b有这么大:
b:  |-----------------------|

我们把b多copy几份,然后跟a比比:
a:  |-----------------------------------------------------------------------------------|
3b: |-----------------------|-----------------------|-----------------------|
余数                                                                        |-----------|
看上面的图,a里面能包含3个b,所以3就是除法结果,剩下的那一块,就是余数。
我是这么理解的,余数,就是范围在b以内的那一部分,它不够一个b的大小了。

那么这里就又有问题了,余数的范围“在b以内”,又是什么意思?

好吧,我喜欢0这个数字(一般我会理解为原点),“在b以内”,那就是在区间(0, b)内(这里b是正数),当然如果b是负数,那这个范围就是(b, 0)。

按照这个理解,7除以-3,余数范围一定是在(-3, 0)内;而-7除以3,余数范围一定是在(0, 3)内。
就是这个结果:
7除以-3,商为-3,余数为-2;
-7除以3,商为-3,余数为2.

好吧,罗嗦这么多,其实就是为了说明余数的范围是在(0, b)或者(b, 0)之间,没有什么特别的意义。

当然如果你就认为余数的范围更广,比如 |余数| 在范围 (0, |b|)之间,那么我上面说的就都没有用了,不同的理解方式而已,没有对与错的区别。(顺便提一句,上面的两条竖线表示数学中的绝对值)

最后,C语言的那个商和余数的正负号,我还是没有理解,印象中以前写过分析的笔记,类似于同号为正,异号为负之类的东西,但是说实话,我记不住那个规律。

最后的最后,我觉得这个东西的争论是没有意义的,不同的理解方式,知道分别是怎么回事就行了,至于谁对谁错嘛,反正把商和余数填进式子里发现结果都是正确的,不是吗?

————————————————————————————————————————————————

那个啥,我又回来了,因为我发现了一点小问题:

7除以-3,可以(商:-2,余数:1),也可以(商:-3,余数-2)。
在python里面,结果是(商:-3,余数:-2)。也就是说,余数取“0和除数”之间的那个(这里就是0和-3之间的,因此余数选-2,而不是1)。
在C里面,结果是(商:-2,余数:1)。也就是说,余数取“更靠近0”的那个(这里就是1,因为它比-2距离0更近一点)。

再看另外一个:-7除以3,可以是(商:-2,余数:-1),也可以是(商:-3,余数:2)。
在python里面,结果是(商:-3,余数:2)。同样的,余数又是取的“0和除数”之间的那个(这里就是0和3之间的,因此余数是2,而不是-1)。
在C里面,结果是(商:-2,余数:-1)。再一次看到,余数是“更靠近0”的那个(这里的-1要比2距离0更近一些,不是吗?)

包含负号的还有另外一个情况,那就是除数和被除数都是负数,我们再来看看这种:
-7除以-3,可以是(商:2,余数:-1),也可以是(商:3,余数:2)
在python里面,结果是(商:2,余数:-1)。再次符合我们的推论,余数取“0和除数”之间的那个(这里就是0和-3之间的,因此是-1,而不是2)。
在C里面,结果是(商:2,余数:-1)。很难得,两种语言中的计算结果居然是一样的。仔细看,这也符合我们对C语言中的推论:余数是“更靠近0”的那个,因为这里的-1比2更靠近0.

综合以上的例子,我做了下面这样一个推论(至少目前我就这样来理解C和python中的除法运算结果了):

在python中,如果做除法运算后,余数有多个选择(一般最多也就两个),那么余数应该选择“0和除数”之间的那个。
而在C中,如果做除法运算后,余数有多个选择(一般最多也就是两个),那么余数应该选择“更靠近0”的那个。

而在确定了余数之后,商是什么就已经确定了,因此答案也就知道了。

这次是真的写完了(一大篇乱七八糟的,其实只看最后的那两句红色部分就行了,但是我就是不提前告诉你们,重走一下我走过的弯路吧,挺好的不是吗?)

转载于:http://blog.sina.com.cn/s/blog_604a238201013l7c.html

0 0
原创粉丝点击