algorithm - restas - Módulo de números negativos
suma de numeros negativos (5)
Posible duplicado:
Mod de número negativo está derritiendo mi cerebro!
Me preguntaba si había un algoritmo mejor para lo que estoy tratando de hacer:
wrapIndex(-6, 3) = 0 wrapIndex(-5, 3) = 1 wrapIndex(-4, 3) = 2 wrapIndex(-3, 3) = 0 wrapIndex(-2, 3) = 1 wrapIndex(-1, 3) = 2 wrapIndex(0, 3) = 0 wrapIndex(1, 3) = 1 wrapIndex(2, 3) = 2 wrapIndex(3, 3) = 0 wrapIndex(4, 3) = 1 wrapIndex(5, 3) = 2
se me ocurrio
function wrapIndex(i, i_max) { if(i > -1) return i%i_max; var x = i_max + i%i_max; if(x == i_max) return 0; return x; }
¿Hay una manera mejor de hacer esto?
Esta solución no tiene sucursales, pero realiza %
dos veces:
function wrapIndex(i, i_max) {
return ((i % i_max) + i_max) % i_max;
}
Debe decirse que se asume el comportamiento de C # / Java de %
, es decir, el resultado tiene el mismo signo que el dividendo . Algunos idiomas definen el cálculo del resto para tomar el signo del divisor en su lugar (por ejemplo, mod
en Clojure). Algunos idiomas tienen ambas variantes (par mod
/ rem
en Common Lisp, Haskell, etc.). Algol-68 tiene %x
que siempre devuelve un número no negativo. C ++ lo dejó hasta la implementación hasta C ++ 11, ahora el signo del resto está (casi) completamente especificado de acuerdo con el signo de dividendo .
Ver también
La solución con dos %
operaciones funciona, pero esto es algo más rápido en la mayoría de los idiomas en la mayoría de hardware (sin embargo, hay excepciones):
int wrapIndex(int i, int i_max) {
i = i%i_max;
return i<0 ? i+i_max : i;
}
Mejor es una cuestión de gusto, pero ¿qué tal
var x = (i_max + i % i_max) % i_max;
Muchos usuarios dieron buenas respuestas, solo tenga cuidado con los números negativos, ya que los diferentes idiomas pueden comportarse de manera diferente. Por ejemplo, este fragmento de C escribe "-1"
int main ()
{
printf("%d/n", (-4) % 3);
}
Mientras que en Python tenemos un valor de salida diferente.
Python 2.6.4 (r264:75706, Dec 7 2009, 18:43:55)
[GCC 4.4.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> (-4) % 3
2
EDIT : En realidad no creo que tengas índices negativos! Sin embargo, es bueno saber eso.
Podrías hacer esto:
function wrapIndex(i, i_max) {
if (i < 0) i = (i % i_max) + i_max;
return i % i_max;
}