suma restas restar resta para numeros niños negativos negativas khan enteros ejercicios ejemplos algorithm math modulo

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; }