Java整数除法余数?

19

我在搜索这个主题,但还是不太明白,如果有人能详细解释一下,我将不胜感激。

我的任务是用整数除法求两个变量的商和余数。 问题是,我不知道什么是余数,目前我做了类似于以下内容,这是我通过在互联网上搜索得到的:

int a;
int b;
int remainder = Math.Pow(a,2) % b;

System.out.println("a^2 / b = " + Math.Pow(a,2) / b);
System.out.println("remainder = " + remainder);

如果我例如设置 (a = 43) 和 (b = 67)

那么我将得到这个结果:

a^2 / b = 27
remainder = 40

现在,因为我不知道余数是多少(这只是来自互联网的建议),所以我不确定这是否是正确答案..?

谢谢任何帮助,

此致敬礼


7
整数除法的余数就是不能被除数整除的部分,例如计算11/4,整数结果为2(4可以整除2次11),余数为3(因为11 - 2*4 = 3)。或者换一种说法:如果你有11个苹果想要平均分给4个人,你只能给每个人2个苹果,然后还剩下3个(余下的)。 - Thomas
由于我不知道余数是什么 - 所以你不理解余数是什么吗?43 * 43是1849,1849除以67是27,余数为40 - 因为27 * 67 = 1809。不清楚你的问题是什么。这有点像说“这里有一个加法代码...它说4 + 5等于9,但我不确定是否正确”。 - Jon Skeet
好的,谢谢。英语不是我的母语,所以可能我没理解清楚。而且我也不擅长数学。 - DisasterCoder
6个回答

27

如果您正在寻找数学取模运算,您可以使用

int x = -22;
int y = 24;
System.out.println(Math.floorMod(x, y));
如果您对于数学中的模(余数)没有兴趣,那么您可以使用:
int x = -22;
int y = 24;
System.out.println(x%y);

2
如果您需要进行模运算(对于正数 y),您也可以执行技巧 ((x % y) + y) % y,但请注意,这可能会导致整数溢出(对于非常大的 y 值)。它确实跳过了函数调用。然而,这是一种优化方法,应仅在必要时应用。 - Maarten Bodewes

8
    public static void main(String[] args) {
        int dividend = 139, divisor = 7;

        int quotient = dividend / divisor;
        int remainder = dividend % divisor;

        System.out.println("The Quotient is = " + quotient);
        System.out.println("The Remainder is = " + remainder);
    }

输出:

商 = 19

余数 = 6


2
是的,% 运算符将返回整数除法的余数。
想了解更多有关整数除法余数的信息,请查看维基百科

如果a和d是整数,其中d非零,则可以证明存在唯一的整数q和r,使得a=qd+r且0≤r <|d|。 数字q称为商,而r称为余数。


或多或少,我仍然需要知道如何在代码中实现它...但是现在我明白使用%-运算符是正确的方法。 - DisasterCoder
是的,没错。我刚刚编辑了我的回答以澄清这一点。 - João Neves

1

int remainder = a % b;这行代码可以解决你的问题。取余运算符会返回除法的余数。


请注意,余数运算符也被称为模运算符。然而,在Java中这是不正确的,因为如果左操作数 a 是负数,Java将返回一个负值。

4
这不是模运算符,而是余数运算符。它们并不是同一件事情。 - Jon Skeet
@DisasterCoder 取决于你的实现规范。你希望它是简单的余数(可以有负值),还是数学上正确的模运算? - SomeJavaGuy
对于这个任务,我相信只需要简单的余数,但是知道两种方法会更好,对吧?那么什么是数学上正确的模运算呢? - DisasterCoder

0

您可以使用商和余数一起计算出商和余数。

这是我为Minecraft插件编写的一些代码。

public class Division {
    public static ModuloDivResult divideMod(double a, double b) {
        double remainder = a % b;
        return new ModuloDivResult((a / b) - (remainder / b), remainder);
    }
}

我们还需要一个容器来存储这两个值。

public class ModuloDivResult {
    private double remainder;
    private double count;

    public ModuloDivResult(double count, double remainder) {
        this.remainder = remainder;
        this.count = count;
    }

    public double getRemainder() {
        return remainder;
    }

    public double getCount() {
        return count;
    }
}

0

% 运算符将返回整数除法的余数。

模块实际上在干什么?

模块倾向于从数字中删除 循环,直到它达到一个小于周期数字的正数,我们称之为模数 一个负数,我们称之为 余数

然而,使用 % 运算符是时间昂贵的。

为了避免使用 % 而获得相同的结果,我们可以使用以下方法:

  • While(a >= n) a -= n;(当a是正数时)
  • While(a < 0) a += n;(当a是负数时)

  • a = n*q + r,这意味着r = a - n*q,其中q是a/n的整数除法,这意味着a%n == a - n * Math.toIntExact(a/n),当a是正数时足够了。

  • a是负数时,我们可以使用(a%n + n) % n,这将给出模数。

时钟案例场景:

如果现在是9点,4小时后是几点?=> 9+4 = 13h => 13%12=1 而12是时钟的周期数

如果我们需要计算现在之前24小时(昨天)的时间,而现在是9点钟,那么: 24(2*12) => 昨天意味着9-24 = -15h,而正确答案是9,为了解决这个问题,我们将使用(a%n + n) % n,而a%n == (a - n * Math.toIntExact(a/n)),然后-15 - 12 * Math.toIntExact(-15/12) = -3 => -3 + 12 = 9 => 9%12 => 9 - 12 * Math.toIntExact(9/12) = 9 这就是正确的答案。

这是时钟场景的代码:

public static void main(String args[]){
    Scanner scanner = new Scanner(System.in);
    int a = scanner.nextInt(); // a = -15
    int n = scanner.nextInt(); // cycle = 12

    int reminder = a - (n * Math.toIntExact(a / n));
    int reminder_plus_n = (reminder + n);
    int modulo = reminder_plus_n - (n * Math.toIntExact(reminder_plus_n / n));
    System.out.println(modulo); // Answer = 9
} 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接