Java模运算符%
基于截断的除法(参见Wikipedia: Modulo operation)。
5%3
生成2
(请注意5/3
生成1
)5%(-3)
生成2
(请注意5/(-3)
生成-1
)(-5)%3
生成-2
(请注意(-5)/3
生成-1
)(-5)%(-3)
生成-2
(请注意(-5)/(-3)
生成1
)在计算科学中,给定两个整数a
和n
,n
> 0,有时在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
答案 0 :(得分:8)
+----+----+-----------+---------+-----------+-----------+---------+-----------+ | x mod y | quotient 'q' | remainder 'r' | | x | y | truncated | floored | Euclidean | truncated | floored | Euclidean | +----+----+-----------+---------+-----------+-----------+---------+-----------+ | 5 | 3 | 1 | 1 | 1 | 2 | 2 | 2 | | -5 | 3 | -1 | -2 | -2 | -2 | 1 | 1 | | 5 | -3 | -1 | -2 | -1 | 2 | -1 | 2 | | -5 | -3 | 1 | 1 | 2 | -2 | -2 | 1 | +----+----+-----------+---------+-----------+-----------+---------+-----------+
其中任何一个至少满足x = yq + r
。
static int truncatedDiv(int x, int y) {
return x / y;
}
static int truncatedMod(int x, int y) {
return x % y;
}
自Java 8以来,您可以使用java.lang.Math
中的方法。请参阅floorDiv和floorMod。
static int floorDiv(int x, int y) {
return Math.floorDiv(x, y);
}
static int floorMod(int x, int y) {
return Math.floorMod(x, y);
}
import static java.lang.Math.*;
static int euclideanDiv(int x, int y) {
int r = x / y;
// if the divident is negative and modulo not zero, round down for positive divisor, otherwise round up
if (x < 0 && r * y != x) {
r -= signum(y);
}
return r;
}
static int euclideanMod(int x, int y) {
int r = x - euclideanDiv(x, y) * y;
return r;
}
import static java.lang.Math.*;
static int euclideanDiv(int x, int y) {
int r = floorDiv(x, y);
// if the divisor is negative and modulo not zero, round up
if (y < 0 && r * y != x) {
r++;
}
return r;
}
static int euclideanMod(int x, int y) {
int r = x - euclideanDiv(x, y) * y;
return r;
}
import static java.lang.Math.*;
static int euclideanMod(int x, int y) {
int r = abs(x) % abs(y);
// apply the sign of divident and make sure the remainder is positive number
r *= signum(x);
r = (r + abs(y)) % abs(y);
return r;
}
答案 1 :(得分:-1)
这段代码怎么样
public static int gcd(int p, int q) {
if(count == 0)
System.out.print("Gcd for " + p + " and " + q);
if (q == 0) {
System.out.println(" returns " + p + " after " + count + " iterations");
return p;
}
count++;
return gcd(q, p % q);
}
public static void main(String[] args) {
count = 0;
gcd(4, 16);
count = 0;
gcd(4, 16);
count = 0;
gcd(16, 4);
count = 0;
gcd(15, 60);
count = 0;
gcd(15, 65);
count = 0;
gcd(1052, 52);
}