2010-04-09 16 views
45

Sé que el operador modulus (%) calcula el resto de una división. ¿Cómo puedo identificar una situación en la que necesitaría usar el operador de módulo?Reconociendo cuándo usar el operador de módulo

Sé que puedo utilizar el operador de módulo para ver si un número es par o impar y primo o compuesto, pero eso es todo. No suelo pensar en términos de residuos. Estoy seguro de que el operador de módulo es útil, y me gustaría aprender a aprovecharlo.

Acabo de tener problemas para identificar dónde se aplica el operador de módulo. En varias situaciones de programación, es difícil para mí ver un problema y darme cuenta "¡Oye! ¡El resto de la división funcionaría aquí!".

+0

Esencialmente, se utiliza por el tiempo, fechas y repetición secuencia – Donato

Respuesta

4

Ejemplo. Tiene un mensaje de X bytes, pero en su protocolo el tamaño máximo es Y e Y < X. Intente escribir una pequeña aplicación que divida el mensaje en paquetes y se encontrará con mod :)

2

Hay muchos casos en los que es útil .

Si necesita restringir un número para que esté dentro de un cierto rango, puede usar mod. Por ejemplo, para generar un número aleatorio entre 0 y 99 se podría decir:

num = MyRandFunction() % 100; 
+6

-1. Esto generará resultados no uniformes a menos que 100 sea un divisor del rango de 'MyRandFunction()'. (Imagine que usted quiere un número aleatorio en '0 .. RAND_MAX * 2/3'.) – kennytm

+1

@KennyTM: 1. Lo que probablemente sea mejor es poder pasar 100 _into_ MyRandFunction() que se encargaría de ello correctamente. Además, proporciona una mejor encapsulación y un acoplamiento mucho más flexible. – Cam

+0

Votó arriba para otro caso de uso común. (Pregunta no es sobre la generación de criptografía de PSRN sonido) – danecando

3

Cálculo de números primos

+7

Aunque realmente no he encontrado una situación en la que realmente se necesita para calcularlos. – anonymous

+0

Diffie-Hellman de intercambio de claves Algoritmo, cifrado PGP –

23

Imagine que tiene un tiempo transcurrido en segundos y que desea convertir esto en horas, minutos y segundo:

h = s/3600; 
m = (s/60) % 60; 
s = s % 60; 
10

lo he utilizado para la restricción de un número a un cierto múltiplo:

temp = x - (x % 10); //Restrict x to being a multiple of 10 
+0

¿Puede dar un uso práctico de esto? –

18
0 % 3 = 0; 
1 % 3 = 1; 
2 % 3 = 2; 
3 % 3 = 0; 

¿Viste lo que hizo? En el último paso volvió a cero. Esto podría ser utilizado en situaciones como:

  1. para comprobar si N es divisible por M (por ejemplo, par o impar) o N es un múltiplo de M.

  2. Para poner una tapa de un valor particular. En este caso 3.

  3. para obtener los últimos dígitos de un número M -> N% (10^M).
+0

¿Puedes explicar la situación número 3? Para obtener los últimos M dígitos de un número -> N% (10^M). –

+0

Por ejemplo, en un [Calendario de Adviento de chocolate] (https://en.wikipedia.org/wiki/Advent_calendar) que se divide por 3 personas. Anna abre la puerta/ventana del calendario el primer día (1) y come el chocolate, Ben en el día 2 y Carl en el día 3, luego Anna otra vez, y así sucesivamente. Haga un 'día% 3' y cuando el resultado sea 1: Anna, 2: Ben, 0: Carl. Todos obtienen su chocolate sin grandes cálculos. – JonyD

10
  • Envolviendo valores (como un reloj).
  • Proporcione campos finitos a algoritmos de clave simétrica.
  • Operaciones a nivel de bit.

Y así sucesivamente.

3

Cada vez que tenga división y desee expresar el resto que no sea en decimal, el operador de mod es apropiado. Las cosas que te vienen a la mente son generalmente cuando quieres hacer algo legible por humanos con el resto. Enumerar cuántos artículos puede poner en cubos y decir "5 sobrantes" es bueno.

Además, si alguna vez en una situación en la que se le puede acumular errores de redondeo, la división de módulo es bueno.Si divide por 3 con bastante frecuencia, por ejemplo, no quiere pasar .33333 como el resto. Pasar el resto y el divisor (es decir, la fracción) es apropiado.

2

El módulo también es muy útil si por alguna razón loca necesita hacer una división de números enteros y obtener una salida decimal, y no puede convertir el entero en un número que admite división decimal, o si necesita devolver una fracción en lugar de un decimal

voy a estar utilizando % como el operador de módulo

Por ejemplo

2/4 = 0

donde hacer esto

2/4 = 0 and 2 % 4 = 2

Por lo que puede ser realmente loco y digamos que desea permitir que el usuario ingrese un numerador y un divisor, y luego muéstreles el resultado como un número entero, y luego un número fraccionario.

whole Number = numerator/divisor 
fractionNumerator = numerator % divisor 
fractionDenominator = divisor 

Otro caso en el que la división de módulo es útil es si aumentan o disminuyen a un número y que desea que contenga el número de un cierto rango de número, pero cuando se llega a la parte superior o inferior que no lo hacen solo quiero parar. Desea hacer un bucle hasta la parte inferior o superior de la lista, respectivamente.

Imagina una función en la que estás recorriendo un conjunto.

Function increase Or Decrease(variable As Integer) As Void 
    n = (n + variable) % (listString.maxIndex + 1) 
    Print listString[n] 
End Function 

La razón de que es n = (n + variable)% (listString.maxIndex + 1) es para permitir el índice max a ser explicada.

Esas son solo algunas de las cosas que he tenido que usar para el módulo en mi programación no solo de aplicaciones de escritorio, sino también en entornos de robótica y simulación.

16

Lo uso para barras de progreso y cosas similares que marcan el progreso a través de un gran bucle. El progreso solo se informa cada enésima vez a través del ciclo, o cuando cuenta% n == 0.

+0

¿Tú también, entonces? Realmente hace una gran diferencia de velocidad. – Kawa

+2

Lo hace de hecho. Para una versión aún más rápida, me gusta usar bit logic: 'count & 0xff == 0' (puedes usar 0xf o 0xff o 0xfff o similar: el punto tiene un número que en binario es una cadena sólida de 1s) – Tobia

3

Como dice @jweyrich, ajustando los valores. He encontrado el mod muy útil cuando tengo una lista finita y quiero iterar sobre ella en un bucle, como una lista fija de colores para algunos elementos de la interfaz de usuario, como series de gráficos, donde quiero que todas las series sean diferentes, para en la medida de lo posible, pero cuando me quedo sin color, solo empiezo de nuevo desde el principio. Esto también se puede usar con, por ejemplo, patrones, de modo que la segunda vez que aparece el rojo, se trunca; la tercera vez, punteado, etc., pero mod solo se usa para obtener rojo, verde, azul, rojo, verde, azul, para siempre.

2
  • Calcular el máximo común divisor
  • Determinar si un número es un palíndromo
  • La determinación de si un número se compone de solamente ...
  • La determinación de la cantidad de ... un número consta de ...
3

El módulo puede ser útil para convertir y dividir el total de minutos a "horas y minutos":

horas = minuto/60

minutes_left = minuto% 60

en horas de poco necesitamos quitar la porción decimal y eso dependerá del idioma que esté usando.

Entonces podemos reorganizar la salida en consecuencia.

+0

También podemos usar un módulo para encontrar si un año es un año bisiesto ya que es divisible por 4. Ejemplo en JS: if (año% 4 === 0) {// es un año bisiesto}. (Nota: una verificación más precisa también verificará la divisibilidad entre 100 y 400) – tony

4

conversión de estructura de datos lineal a la matriz estructura: donde a es índice de los datos lineales, y b es el número de objetos por fila:

row = a/b 
column = a mod b 

Nota lógica anterior se simplifica: a sea compensada -1 antes dividiendo & el resultado debe ser normalizado +1.

Ejemplo: (3 filas de 4)

1 2 3 4  
5 6 7 8  
9 10 11 12 

(7 - 1)/4 + 1 = 2 

7 is in row 2 

(7 - 1) mod 4 + 1 = 3 

7 is in column 3 

Otro uso común del módulo: hashing un número por lugar. Suponga que desea almacenar el año & en un número de seis dígitos 195810. month = 195810 mod 100 todos los dígitos 3ra. Desde la derecha son divisibles por 100, por lo que el resto son los 2 dígitos más a la derecha; en este caso, el mes es 10. Para extraer el año 195810/100, rinda 1958.

+0

¿Por qué debe compensar por 1? –

1

Mi favorito es el uso para la iteración.

Supongamos que tiene un contador que está incrementando y desea obtener de una lista conocida los elementos correspondientes, pero solo tiene n elementos para elegir y desea repetir un ciclo.

var indexFromB = (counter-1)%n+1;

Resultados (counter=indexFromB) dada n=3:

`1=1` 
`2=2` 
`3=3` 
`4=1` 
`5=2` 
`6=3` 
... 
2

un caso de uso que vi hace poco estaba cuando se necesita para revertir un número. De modo que 123456 se convierte en 654321 por ejemplo.

int number = 123456; 
int reversed = 0; 

while (number > 0) { 
    # The modulus here retrieves the last digit in the specified number 
    # In the first iteration of this loop it's going to be 6, then 5, ... 
    # We are multiplying reversed by 10 first, to move the number one decimal place to the left. 
    # For example, if we are at the second iteration of this loop, 
    # reversed gonna be 6, so 6 * 10 + 12345 % 10 => 60 + 5 
    reversed = reversed * 10 + number % 10; 
    number = number/10; 
} 
1

Es una manera fácil de saber si un número es par o impar. Solo haz # mod 2, si es 0 es par, 1 es impar.

Cuestiones relacionadas