【问题标题】:How can I handle non-negative mods?我如何处理非负模式?
【发布时间】:2011-10-13 23:12:24
【问题描述】:

当我在我的 Java 程序中使用运算符 % 时,我不断得到否定的答案。示例:-1%100 给出 -1。虽然这在数学上是正确的,但我想获得正常的数学解,即 99。换句话说,我想获得最小的正整数解。在 Java 中是否有任何简单的解决方案(也许我在数学中忽略了一些东西?--我找不到)?

我还想澄清一下,如果 API 中有这样做的东西,那么链接会很棒。

【问题讨论】:

  • 数学上正确的解正常的数学解。您没有清楚地提出您的问题,但听起来您想在修改变量之前获取变量的绝对值。
  • @Perception,他的意思是他想要除法算法意义上的除法余数。也就是说,他想要一个介于 0 和 99 之间的解,包括 0 和 99。大多数数学家(不同于计算机科学家)会认为这是更有意义的余数概念。
  • 我在数学课上总是把它作为最小正整数解决方案。而且,-1 mod 100 != 1 mod 100。这就是你的意思吗?
  • 另见modulo operation

标签: java modulo


【解决方案1】:

你可以这样做吗?

int d = 100;

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

这应该适用于任何积极的d

【讨论】:

  • 不,很遗憾。 100 并不总是模组。它因人而异。
  • 是否需要处理负模数?
  • if 语句在模数之后应用。所以它不应该小于-99。
  • 模数将返回不少于 -99。因此,应该永远不需要超过一个 add-back。
  • 我不知道有这方面的 API,因为它看起来有点微不足道。
【解决方案2】:

您可以执行以下操作

int myMod(int x, int modulo)
{
   return ((x % modulo) + modulo)  % modulo
}

【讨论】:

    【解决方案3】:

    这适用于任何代替 d 或 x 的值。

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

    【讨论】:

    • 您只是复制了我的答案并更改了格式吗? (编辑:没关系,您将 if 更改为 while。请参阅我的答案中的 cmets...)
    【解决方案4】:
    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
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-26
    • 2020-07-10
    • 2014-09-18
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    • 2018-12-07
    相关资源
    最近更新 更多