负数取模运算
转自
:http://loveli0917.blog.163.com
最近带的助教班中,有人问
负数怎么取模,故上网搜了一下,感觉下面这篇帖
子写得很不错,故拷过来借鉴下,原文:
http://ceeji.net/blog/mod-in-real/
最近在一道
Java
习题中,看到这样的一道题:
What
is
the
output
when
this
statement
executed: System.out.printf(-7
%
3);
正整数的取余运算大家都很熟悉,
但是对于负数、
实数的取余运算,
确实给人很
新鲜的感觉。
于是我对此进行了一些探索。
我发现,
这里面还是颇有一点可以探
索的东西的。
自然数的取模运算
的定义是这样的(
定义
1
):
如果
a
和
d
是两个自然数,
d
非零,可以证明存在两个唯一的整数
q
和
r
,满
足
a = qd+ r
且
0
≤
r
。其中,
q
被称为商,
r
被称为余数。
那么对于负数,
是否可以沿用这样的定义呢?我们发现,
假如我们按照正数求余
的规则求
(-7) mod 3
的结果,就可以表示
-7
为
(-3)* 3 +2
。其中,
2
是余数,
-3
是商。
那么,
各种编程语言和计算器是否是按照这样理解的呢?下面是几种软件中对此
的理解。
C++
(
G++
编译)
:
cout <
输出
-1
Java
(
1.6
)
:
System.out.println((-7) % 3); //
输出
-1
Python 2.6
:
>>>
(-7) % 3 //
输出
2
百度计算器
:
(-7) mod 3 = 2
计算器
:
(-7) mod 3 =
2
有道计算器
:
(-7) mod 3 = -1
可以看到,
结果特别有意思。
这个问题是
百家争鸣
的。
看来我们不能直接把正数
的法则加在负数上。
实际上,
在
整数范围
内,
自然数的求余法则并不被很多人所