Как я могу обрабатывать неотрицательные моды?

#java #modulo

#java #modulo

Вопрос:

Когда я использую operator % в своих Java-программах, я продолжаю получать отрицательные ответы. Пример: -10 дает -1. Хотя это математически правильно, я хочу получить обычное математическое решение или 99. Другими словами, я хочу получить наименьшее положительное целое решение. Есть ли какое-либо простое решение для этого в Java (возможно, что-то, что я упустил из виду в математике? — Я не могу его найти)?

Я также хочу уточнить, что если в API есть что-то, что делает это, ссылка была бы потрясающей.

Комментарии:

1. Математически правильное решение — это обычное математическое решение. Вы не задали свой вопрос четко, но звучит так, как будто вы хотите получить абсолютное значение вашей переменной перед ее изменением.

2. @Восприятие, он имеет в виду, что ему нужен остаток при делении в смысле алгоритма деления. То есть он хочет получить решение от 0 до 99 включительно. Большинство математиков (в отличие от компьютерных ученых) сочли бы это более значимым понятием остатка.

3. Я всегда делал это на уроках математики как наименьшее положительное целое решение. Но также, -1 мод 100 ! = 1 мод 100. Это то, что вы имели в виду?

4. См. Также операция по модулю .

Ответ №1:

Вы можете просто сделать это?

 int d = 100;

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

Это должно работать для любого положительного d .

Комментарии:

1. К сожалению, нет. 100 не всегда будет модом. Это зависит.

2. Вам нужно обрабатывать отрицательный модуль?

3. Оператор if применяется после модуля. Поэтому оно не должно быть меньше -99.

4. Модуль вернет не менее -99. Таким образом, никогда не должно требоваться более одного дополнения.

5. Я не знаю 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;
  

Комментарии:

1. Вы только что скопировали мой ответ и изменили форматирование? (РЕДАКТИРОВАТЬ: неважно, вы изменили if на a while . Смотрите Комментарии к моему ответу …)

Ответ №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 amp;amp; java Mod
mod(-201, 100) == 99
mod(-200, 100) == 0
mod(17, 100) == 17
mod(100, 100) == 0
  

Нет циклов.

Комментарии:

1. Это не сработает, если i % n равно 0, а i < 0; например, mod(-200, 100) == 100 вместо 0.