Java - 是否有欧几里得或落地模的方法问题杂项
2022-09-04 22:23:35
Java模运算符基于截断除法(参见维基百科:模运算)。%
-
5%3
生产(注意,产生2
5/3
1
) -
5%(-3)
生产(注意,产生2
5/(-3)
-1
) -
(-5)%3
生产(注意,产生-2
(-5)/3
-1
) -
(-5)%(-3)
生产(注意,产生-2
(-5)/(-3)
1
)
在计算科学中,给定两个整数和,>0,有时获得与模一致的唯一整数是有用的。a
n
n
r
[a,n[
a
n
问题
Java中是否有一个有效的泛型运算符/方法尊重这个模规范?
这是为了避免在每个需要它的项目中重写它...
杂项
我在stackoverflow上发现了很多关于这个问题的问题,其中大多数都混淆了不同的模实现。如果您只是对负数的模运算结果感到困扰,以下是一些基于 Java %
运算符的可能有用的实现。
常见黑客
由于我们几乎不使用负除数,因此此实现在 .n > 0
static int mod(int a, int n){
return a<0 ? (a%n + n)%n : a%n;
}
-
mod( 5, 3)
生产2
-
mod(-5, 3)
生产1
欧几里得模
static int euclideanModulo(int a, int n){
return n<0 ? euclideanModulo(a, -n) : mod(a, n);
}
-
euclideanModulo( 5, 3)
生产2
-
euclideanModulo(-5, 3)
生产1
-
euclideanModulo( 5,-3)
生产2
-
euclideanModulo(-5,-3)
生产1
地板模量
static int flooredModulo(int a, int n){
return n<0 ? -flooredModulo(-a, -n) : mod(a, n);
}
-
flooredModulo( 5, 3)
生产2
-
flooredModulo(-5, 3)
生产1
-
flooredModulo( 5,-3)
生产-1
-
flooredModulo(-5,-3)
生产-2