-10 mod 3 离散数学书上答案是2,C++运行-10 % 3 = -1,怎么整嘛...

如题所述

自然数的取模运算的定义是这样的:
如果a和d是两个自然数,d非零,可以证明存在两个唯一的整数 q 和 r,满足 a = qd + r 且0 ≤ r < d。其中,q 被称为商,r 被称为余数

那么对于负数,是否可以沿用这样的定义呢?
假如我们按照正数求余的规则求 (-10) mod 3 的结果,就可以表示 -10 为 (-4)* 3 +2。
其中,2是余数,-4是商。
进一步,如果允许余数是负数,它的绝对值小于除数呢,那就
可以表示 -10 为 (-3)* 3 -1。-1 是余数,-3是商。

C++: cout << (-10) % 3; // 输出 -1
Java: System.out.println((-10) % 3); // 输出 -1
Python :>>> (-10) % 3 // 输出 2
百度计算器:(-10) mod 3 = 2
Google 计算器:(-10) mod 3 = 2
有道计算器:(-10) mod 3 = -1

所以,负数模运算 尚无统一定论。不好绝对地 说哪个对,哪个错。

个人看法,-10 % 3 = -1 计较合理。
因为 -10 / 3 = -3, 不该 等于 -4
于是 余 -1 也顺理成章,较合理,易理解。
温馨提示:内容为网友见解,仅供参考
第1个回答  2017-10-30

    这个和mod函数的性质有关,mod(x,y)函数在(x,y)两数同号时自不必说,异号时,

    函数值符号规律(余数的符号) mod(负,正)=正 mod(正,负)=负
    结论:两个整数求余时其值的符号为除数的符号。

    取值规律 先将两个整数看作是正数,再作除法运算
    ①能整除时,其值为0 (或没有显示)
    ②不能整除时,其值=除数×(整商+1)-被除数

    -10mod3=除数×(整商+1)-被除数=3×(3+1)-10=2

    而c++中,运算优先级就不一样了,-10%3=-(10%3)=-1

第2个回答  2013-10-11
负数取模(也就是求余数除法)有两个结果,一个负余数一个正余数,在有些地方,比方说你的离散数学书上,他是约定余数一定为正数的,所以答案当然是2,貌似数学上一般都约定余数为正,但是在很多计算机语言,以及其它地方,余数都约定和被除数符号相同,所以C++这个取模的结果就是-1了,不要太纠结于这个,只是个约定而已
第3个回答  2013-10-11
这跟计算机计算原理有关,正如楼上所说,负数求模是有一个正余数,一个负余数的,计算机对负数求模时使用的是负余数,这里你可以这样看,符号位不参与求模运算,即取绝对值,求模后在模数前加上被除数的符号。即10%3=1,加上符号为-1.
相似回答