python中整数除法的正负号
2014-04-01 09:41
781 查看
先看下面几个小题目:其中符号“//”表示除法结果的整数部分(即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
(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
相关文章推荐
- python2中除法两整数相除为整数
- python整数除法保留两位小数
- 一段python 代码(涉及编解码,整数的除法运算,文件操作)
- C++ 与 python 整数除法差异
- ??待解决---整数除法
- Divide Two Integers-不用'/' '*' '%'操作实现整数的除法
- 利用python写出的算法 关于输入非正数的整数打印出其英语
- Python中的除法和取模
- java语言实现:数论经典问题 除法表达 ,无平方因子数 ,直线上的点,同余与模算术 大整数取模 幂取模,模线性方程
- python中,用input()输入一个整数
- Python中整数对象的实现
- python中的除法和取模
- python2.x与3.x除法的区别
- 使用main函数的参数,实现一个整数计算器,程序可以接受三个参数,第一个参数“-a”选项执行加法,“-s”选项执行减法,“-m”选项执行乘法,“-d”选项执行除法,后面两个参数为操作数。
- 2 python 四位数整数补零
- python中整数除以整数的结果是取整数
- python整数与IP地址转换 [转]
- Python3基础 int input提示用户输入一个整数并接受用户输入
- python学习 整数
- Python 字符串 转换 整数 浮点数 数字