本篇博客在于理清比较困扰的负数求余运算或者取模运算!!!!
1、基本概念
余数,数学用语。在整数的除法中,只有能整除与不能整除两种情况。当不能整除时,就产生余数,取余数运算:a mod b = c(b不为0) 表示整数a除以整数b所得余数为c,如:7÷3 = 2 ······1。
百度百科对余数的解释:
https://baike.baidu.com/item/%E4%BD%99%E6%95%B0/6180737?fr=aladdin
以下为在网上搜索及自己理解所整理!!!!!!!!!!!!
2、通常余数求取的理解
变量说明:
n:num,表示一个整数,在这里代表被除数(dividend)
q:quotient,表示两数相除的商
d:divisor,表示除数,为非0整数
r:remainder,表示余数
这四者满足以下关系:
- a = q*d+r
- 0 <= |r| < |d|
通常会有正余数r1与负余数r2两个余数,且满足:
- |d| = |r1| + |r2|
在计算机语言中,
同号整数运算通常都遵循商尽可能小原则,所以11mod10 (或11%10,后边表达式类似) 结果为1,此处没有异议;-11mod-10,商为1,余数为-1
异号整数运算中,python遵循商尽可能小原则,比如:-1 mod 10 ,商为-1,余数为9;1 mod -10 ,商-1,余数为-9
c/c++ 和java遵循商尽可能大原则 ,比如:-1 mod 10 ,商为0,余数为-1;1 mod -10 ,商0,余数为1
在以上理解的基础上在此说明“求余”与“取模”两者的区别:
3、“求余”与“取模”两者的区别
对整型变量n、d来说,求余运算和取模运算的公式都是:
1.求整数商:q=n/d;
2.计算余数或者模:r=n-q*b。
两种运算在第一步时就产生了不同的结果:求余运算在取q的值时,向正无穷方向舍入(商尽可能大);而取模运算在计算q的值时,向负无穷方向舍入(商尽可能小)。
例如:计算-9 mod 5
设a=-9,b=5
1.求整数商:求余运算得q=-1(向0方向舍入);取模运算得q=-2(向负无穷方向舍入)。
2.计算余数或者模:由于c值不同,求余得r=-4;取模得r=1。
归纳:
n和d符号相同时,求余和取模结果相同;
n和d符号不同时,求余结果的符号和n相同,取模结果的符号和d相同。
另外不同环境下“%”运算符的含义也不同:
1.c/c++、Java为求余
2.Python为取模
python实例:
print(1%10) print(-1%10) print(1%-10) print(-11%-10)
执行结果:
java实例:
public static void main(String[] args) { System.out.println(1%10); System.out.println(-1%10); System.out.println(Math.floorMod(-1,10)); System.out.println(1%-10); System.out.println(Math.floorMod(1,-10)); System.out.println(-11%10); }
java执行结果:
参考:
https://blog.csdn.net/weixin_44252966/article/details/85248165