Как я могу обработать неотрицательные моды? - PullRequest
6 голосов
/ 14 октября 2011

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

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

Ответы [ 4 ]

3 голосов
/ 14 октября 2011

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

int d = 100;

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

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

2 голосов
/ 14 октября 2011

Вы можете сделать следующее

int myMod(int x, int modulo)
{
   return ((x % modulo) + modulo)  % modulo
}
0 голосов
/ 14 октября 2011
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

Без петель.

0 голосов
/ 14 октября 2011

Это работает для любых значений вместо d или x.

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