负整数的整除和取余运算

计算机 python c/c++ 编程 数学



	负整数间是怎么整除和取余数的呢?

	数学上貌似没定义,但计算机确实能算。于是就试了试,想总结一下规律。

	一不小心发现,C/C++ 和 Python 下的结果是不同的:




				 

C/C++

Python

精确值





-14/3

-4

-5

-4.67



-14%3

-2

1

/



14/-3

-4

-5

-4.67



14%-3

2

-1

/



-14/-3

4

4

4.67



-14%-3

-2

-2

/




	总结规律如下:


		两种语言中,商和余数都符合 被除数=商x除数+余数 这一数学规律。

		两种语言中,整除的方法不同:C/C++ 是向零取整(负数向上、正数向下取整),Python 是下取整。


	 

	以 n/3 和 n%3 为例,看看这两种处理方法的区别。

	C 的情况,两种运算结果都关于0对称和反号:




				n

				-5

				-4

				-3

				-2

				-1

				0

				+1

				+2

				+3

				+4

				+5



				商

				-1

				-1

				-1

				0

				0

				0

				0

				0

				1

				1

				1



				余数

				-2

				-1

				0

				-2

				-1

				0

				1

				2

				0

				1

				2




	Python 的情况,运算结果是完全连续的:




				n

				-5

				-4

				-3

				-2

				-1

				0

				+1

				+2

				+3

				+4

				+5



				商

				-2

				-2

				-1

				-1

				-1

				0

				0

				0

				1

				1

				1



				余数

				1

				2

				0

				1

				2

				0

				1

				2

				0

				1

				2




	不知道那种在数学上更好用。个人觉得 Python 的处理方式更优美一些吧。

	 

	至于其他语言的处理方法,应该也出不了这两种。我所知道的:


C/C++ “向零取整式整除”:C/C++、Java、bash

Python “下取整式整除”:Python、Perl、Lua


__RAW_HTML__

Page created on 2013-03-30