取模运算中的正负值
已知 m > 0 且为整数。
格式 | 范围 |
---|---|
正数 % m | 0 ~ m-1 |
正数 % -m | 0 ~ m-1 |
负数 % m | -(m-1) ~ 0 |
负数 % -m | -(m-1) ~ 0 |
规律:正数取余数为非负值,负数取余数为非正数(模运算时最容易忽略的一点)
int j;
for (int i = -10; i < 0; i++) {
j = -i;
System.out.println(j + " / 5 = " + j / 5 + " ... " + (j % 5));
System.out.println(j + " / -5 = " + j / -5 + " ... " + (j % -5));
System.out.println(i + " / 5 = " + i / 5 + " ... " + (i % 5));
System.out.println(i + " / -5 = " + i / -5 + " ... " + (i % -5));
System.out.println("--------------------------------");
}
看出来的规则
a % p % p ⋅ ⋅ ⋅ % p = a % p a\%p\%p···\%p = a\%p a%p%p⋅⋅⋅%p=a%p
交换律
交换位置,结果不变。交换括号中的内容 emmmmmmmmm
( a + b ) % m = ( b + a ) % m (a + b) \% m = (b + a) \% m (a+b)%m=(b+a)%m
( a ∗ b ) % m = ( b ∗ a ) % m (a * b) \% m = (b * a) \% m (a∗b)%m=(b∗a)%m
分配律
( a + b ) % m = ( a % m + b % m ) % m (a + b ) \% m = (a\%m + b\%m) \% m (a+b)%m=(a%m+b%m)%m
为啥不是 ( a + b ) % m = a % m + b % m (a + b ) \% m = a\%m + b\%m (a+b)%m=a%m+b%m 呢?
假设此时
a >= 0, b >= 0
,那么a + b >= 0
,则有
a % m
、b % m
和(a + b) % m
范围都是0 ~ m-1
,
a % m + b % m
相加范围是0 ~ 2m-2
,要使 ( a + b ) % m = a % m + b % m (a + b ) \% m = a\%m + b\%m (a+b)%m=a%m+b%m 成立,则
2m - 2 = m - 1
,则有m = 1
,退化成加法运算,取模无意义
( a − b ) % m = ( a % m − b % m ) % m (a - b) \%m = (a \%m - b\%m) \%m (a−b)%m=(a%m−b%m)%m
( a ∗ b ) % m = ( a % m ∗ b % m ) % m (a*b)\%m = (a\%m * b\%m)\%m (a∗b)%m=(a%m∗b%m)%m
a b % m = ( a % m ) b % m a^b \% m = (a\%m)^b \% m ab%m=(a%m)b%m
结合律
( ( a + b ) % p + c ) % p = ( a + ( b + c ) % p ) % p ((a+b) \% p + c) \% p = (a + (b+c) \% p) \% p ((a+b)%p+c)%p=(a+(b+c)%p)%p
根据上边的证明:
左半边: ( ( a + b ) % p + c ) % p ((a + b) \%p + c) \%p ((a+b)%p+c)%p
= ( ( a + b ) % p + c % p ) % p = ((a + b) \%p + c \% p) \% p =((a+b)%p+c%p)%p
= ( a + b + c ) % p = (a + b + c) \% p =(a+b+c)%p
同理右半边也可以推出 ( a + b + c ) % p (a + b + c) \% p (a+b+c)%p
( ( a ∗ b ) % p ∗ c ) % p = ( a ∗ ( b ∗ c ) % p ) % p ((a * b) \% p * c) \% p = (a * (b * c) \% p) \% p ((a∗b)%p∗c)%p=(a∗(b∗c)%p)%p
参考:https://blog.csdn.net/qq_40816078/article/details/89739136