Java - 是否有欧几里得或落地模的方法问题杂项
2022-09-04 22:23:35
Java模运算符基于截断除法(参见维基百科:模运算)。%
-
5%3生产(注意,产生25/31) -
5%(-3)生产(注意,产生25/(-3)-1) -
(-5)%3生产(注意,产生-2(-5)/3-1) -
(-5)%(-3)生产(注意,产生-2(-5)/(-3)1)
在计算科学中,给定两个整数和,>0,有时获得与模一致的唯一整数是有用的。annr[a,n[an
问题
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