2010-08-28 27 views
10

Duplicar posible:
Recognizing when to use the mod operator¿Cuáles son los usos prácticos del módulo (%) en la programación?

¿Cuáles son los usos prácticos del módulo? Sé lo que es la división de módulo. El primer escenario que me viene a la mente es usarlo para encontrar números impares y pares, y la aritmética del reloj. Pero, ¿en qué otro lugar podría usarlo?

+6

Demasiadas aplicaciones. Probablemente esto debería ser wiki de la comunidad. – kennytm

+5

Lo usa cuando es necesario. La "aritmética de reloj" cubre todos los usos, ¿no es así? –

Respuesta

5

Para imprimir un número como cadena, necesita el módulo para encontrar el valor de un dígito.

string number_to_string(uint number) { 
    string result = ""; 
    while (number != 0) { 
    result = cast(char)((number % 10) + '0') ~ result; 
    //     ^^^^^^^^^^^ 
    number /= 10; 
    } 
    return result; 
} 
+0

+1 para usar D. :) –

19

El uso más común que he encontrado es para "envolver" sus índices de matriz.

Por ejemplo, si lo que desea es pasar por una serie repetida, se puede utilizar:

int a[10]; 
for (int i = 0; true; i = (i + 1) % 10) 
{ 
    // ... use a[i] ... 
} 

El módulo asegura que i estancias en el) rango [0, 10.

+1

No pude pensar en ningún uso útil de un ciclo tan infinito, pero parece genial. – 2ndkauboy

+0

@ Kau-Boy Una serie de imágenes para recorrer el encabezado de un sitio web tal vez, pero luego es menos trivial establecer 'if (i> count (array)) i = 1;' para iniciarlo de nuevo. Sin embargo, el bucle for colocará muy bien el código de visualización requerido dentro de un bloque. – amcc

+0

Gran respuesta y uso. – fanbondi

3
  • Criptografía. Solo eso explicaría un porcentaje obsceno de módulo (exagero, pero entiendes el punto).

Trate the Wikipedia page también:

aritmética modular se hace referencia en la teoría de números, la teoría de grupos, la teoría de anillos, la teoría de nudos, álgebra abstracta, la criptografía, la informática, la química y las artes visuales y musicales.

En mi experiencia, cualquier algoritmo suficientemente avanzado probablemente tocará en uno más de los temas anteriores.

5

Un uso para la operación del módulo es cuando se hace un hash table. Se usa para convertir el valor de la función hash en un índice en la matriz. (Si el tamaño de la tabla hash es una potencia de dos, el módulo podría hacerse con una máscara de bits, pero es todavía una operación de módulo.)

+0

¿Puedes hacer un ejemplo de código? – eaglei22

2

Bueno, hay muchos puntos de vista que usted puede buscar en ella. Si lo ves como una operación matemática, entonces es solo una división de módulo. Aunque no necesitamos esto como lo haga%, también podemos usar la sustracción, pero cada lenguaje de programación lo implementa de manera muy optimizada.

Y la división de modulu no se limita a la búsqueda de números impares o aritméticos de reloj. Hay cientos de algoritmos que necesitan esta operación de módulo, por ejemplo, algoritmos de criptografía, etc. Así que es una operación matemática general como otros +, -, *, /, etc.

Excepto la perspectiva matemática, diferentes idiomas usan esto símbolo para definir las estructuras de datos incorporadas, como en Perl %hash se usa para mostrar que el programador declaró un hash. Por lo tanto, todo varía según el diseño del lenguaje de programación.

Así que todavía hay muchas otras perspectivas que se pueden agregar a la lista de uso de%.

3

La implementación habitual de las comunicaciones en búfer utiliza búferes circulares y los gestiona con módulos aritméticos.

2

Para los idiomas que no tienen operadores bit a bit, el módulo se puede usar para obtener los n bits más bajos de un número. Por ejemplo, para obtener los 8 bits más bajos de x:

x % 256 

lo que equivale a:

x & 255 
+2

Esto no es lo suficientemente genérico, solo funciona para 2^n. – Gob00st

+2

Es importante tener en cuenta que esa fórmula solo funciona para valores no negativos de x. Si x es negativo, 'x & 255' informará correctamente los bits más bajos, mientras que en la mayoría de los compiladores (incluidos todos los que cumplen los últimos estándares) x% 256 arrojará basura. – supercat

4

lo general usarlos en los bucles, cuando tengo que hacer algo cada X bucles en contraposición a en cada iteración ..

Ejemplo:

int i; 
for (i = 1; i <= 1000000; i++) 
{ 
    do_something(i); 
    if (i % 1000 == 0) 
     printf("%d processed\n", i); 
} 
+1

En algunas implementaciones, esto puede ser muy costoso. –

3

para el número de control de cuenta bancaria internacional n umbers, el mod97 technique.

También en grandes lotes para hacer algo después de n iteraciones. Aquí hay un ejemplo para NHibernate:

ISession session = sessionFactory.openSession(); 
ITransaction tx = session.BeginTransaction(); 

for (int i=0; i<100000; i++) { 
    Customer customer = new Customer(.....); 
    session.Save(customer); 
    if (i % 20 == 0) { //20, same as the ADO batch size 
     //Flush a batch of inserts and release memory: 
     session.Flush(); 
     session.Clear(); 
    } 
} 

tx.Commit(); 
session.Close(); 
Cuestiones relacionadas