如何处理非负数取模?

6
当我在我的Java程序中使用%运算符时,我总是得到负数的答案。例如:-1%100的结果为-1。虽然这在数学上是正确的,但我想得到正常的数学解,即99。换句话说,我想得到最小的正整数解。在Java中是否有任何简单的解决方案(也许是我在Math中忽略了什么?--我找不到)?
我还想澄清一点,如果API中有做到这一点的内容,那么提供链接将是很棒的。

数学上正确的解决方案正常的数学解决方案。你没有清楚地提出问题,但听起来你想在对变量取模之前取其绝对值。 - Perception
1
@Perception,他的意思是他想要除法算法中的余数。也就是说,他想要一个在0到99之间(包括边界)的解决方案。大多数数学家(与计算机科学家不同)会认为这是更有意义的余数概念。 - Hammerite
我在数学课上一直将其作为最小正整数解来处理。但是,-1 mod 100 != 1 mod 100。这是你的意思吗? - varatis
1
另请参见模运算 - trashgod
4个回答

3
你只需要这样做吗?
int d = 100;

int x = -1 % d;
if (x < 0)
    x += d;

这应该适用于任何正数的d

你需要处理负数取模吗? - Mysticial
if语句应用于模数之后。因此,它不应小于-99。 - Mysticial
2
模数将不会返回小于-99的值。因此,最多只需要进行一次加回。 - Mysticial
好的,我的错。但如果可能的话,我仍然希望找到一个在API中的解决方案... - varatis
4
我不知道有没有为此提供API,因为这似乎有点琐碎。 - Mysticial
显示剩余2条评论

2
您可以执行以下操作。
int myMod(int x, int modulo)
{
   return ((x % modulo) + modulo)  % modulo
}

0

这个代码可以适用于任何d或x的值。

int d=100;
int x=-1%d;
while (x<0)
    x+=d;

你刚刚是抄袭了我的答案并更改了格式吗?(编辑:算了,你把“if”改成了“while”。请看我的回答中的评论...) - Mysticial

0
i < 0 ? n - ((-i - 1) % n + 1) : i % n

例如:

class Mod {
  public static int mod(int i, int n) {
    return i < 0 ? n - ((-i - 1) % n + 1) : i % n;
  }

  public static void main(String [] args) {
    System.out.println("mod(-201, 100) == " + mod(-201, 100));
    System.out.println("mod(-200, 100) == " + mod(-200, 100));
    System.out.println("mod(17, 100) == " + mod(17, 100));
    System.out.println("mod(100, 100) == " + mod(100, 100));
  }
}

而且

$ javac Mod.java && java Mod
mod(-201, 100) == 99
mod(-200, 100) == 0
mod(17, 100) == 17
mod(100, 100) == 0

不要使用循环。


如果 i % n 为 0 且 i < 0,则此方法无效;例如,mod(-200, 100) 的结果是 100 而不是 0。 - Lajos Molnar

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