El ganado fuera para probar la oferta de red de seguridad 46 preguntas - (número de círculos en el último restante) un juego de niños

tema:

día de los niños cada año, vaca-off prepararán algunos pequeños regalos para visitar a los niños del orfanato, este año también es cierto. Como un veterano de HF ganado, naturalmente, hemos preparado algunos juegos. Entre ellos, hay un juego de la siguiente manera: En primer lugar, que los niños rodeadas por un círculo grande. A continuación, asigna aleatoriamente un número m, de manera que el número de niños 0 Número poniendo. Llorado cada vez m-1 los niños cantan una canción a estar fuera de la línea, entonces cualquiera de las cajas de regalo en la elección de un regalo, y no regresar al círculo, empezando por su próximo hijo, continúe 0 m ... -1 número de paquetes .... .... seguir hasta que el último hijo restante, no se puede realizar, y obtener el ganado fuera de los raros "Detective Conan" Edición coleccionista (plazas limitadas oh !! ^ _ ^). ¿Quieres probar siguiente, que los hijos recibirán los regalos que? (NOTA: El número de niños es de 0 a n-1)
Si no hay niños, devuelve -1.
Ideas: La esencia de esta pregunta es: un problema Josefo! ! !
Las ideas son como sigue:

Para facilitar la discusión, el primer problema que se describirá de acuerdo con la intención original del lenguaje de las matemáticas.

Problemas: El número de 0 ~ (N-1) dispuestos en un círculo que N individuos, el número de paquetes en el inicio agujas del reloj desde 0, M-1 informe humana salida cola circular, el resto de la cantidad de paquetes continúa desde cero , repetir. Por último, encontrar el primer número de la columna por una cola circular.

Aparece en primer lugar por debajo de 0 ~ (N-1) N Este individuo original numerado como sigue:

El proceso anterior se encontró derivada, la primera columna de número de una persona debe ser (M-1)% n. Por ejemplo, en 41 individuos, 3 personas informan de si la columna es una primera columna de una persona debe ser un número (3-1) 2 = 41%, número de señalar aquí es cero, por lo que el número real 2 1 corresponde al número 3 como punto de partida. La descripción anterior, un elemento frontal de m (M-1) tiene una columna, una lista de las personas que se indican como sigue:

De acuerdo con las reglas, cuando era una columna, y de que se inicie el próximo al número de posición de paquete 0, se ajusta la lista anterior (es decir, la posición de inicio en forma de M, a continuación, N-1, seguido por el 0,1,2 ...... formar un cíclico):

Dispuestos en orden pasan a ser por encima de, la siguiente relación de correspondencia obtiene:

Esto es, la que está en la fila de datos sería para reorganizar la lista 0 ~ (N-2) N-1 individuos fueron, tratando de seguir la N-1 participantes, el número de paquetes de acuerdo a una columna de M-1 es decir, la Solución el último número de la primera columna por una cola circular.

Lo que la ley no ve? Sí, en un tiempo de tratamiento, se reduce la magnitud del problema. Es decir, el número N de individuos informó problemas pueden resolverse primera descomponen en (N-1) número de sub-problemas de los paquetes individuales, mientras que para las sub-preguntas (N-1) número de paquetes individuales, una primera con el fin de ser descompuesto [(N -1) sub-problemas. -1] número de personas informó .......

El tamaño mínimo del problema es qué? Es decir, cuando sólo una persona (N = 1), informó que el número de (M-1) de la línea de personas, que, finalmente, la columna es? Por supuesto, sólo el número 0 es esta persona. De acuerdo con ello, se pueden proporcionar las siguientes funciones:

Entonces, cuando N = 2, el número de paquetes a (M-1) de columna de una persona, que última columna de la? Debe obtener el número reportado sólo una persona fuera de la última columna de números más M, informe de M-1 porque la gente ha estado fuera de la línea, sólo 2 personas, el otro es la última persona en salir de la línea de columnas, se pueden formular como la siguiente forma:

Mediante el cálculo de la fórmula anterior, el resultado F (2) puede exceder el valor de N (número total). Por ejemplo, establezca N = 2, M = 3 (es decir, 2 individuos, el número de paquetes a la columna 2), se obtiene el valor calculado de la prensa:

Un total de sólo dos personas involucradas, N ° 3 que al parecer no lo hizo. ¿Cómo hacer? Debido a que se informó que comenzó entonces el número de cíclico, así que después de dos número de paquete completo, numerados del 0 y del número de paquetes. De acuerdo con este principio, el número total de valores puede obtenerse operación N módulo, a saber:

5.5.4 matemáticamente Josefo Solution (2)

Es decir, N = 2, M = 3 (es decir, hay dos individuos, que informó de que el número de la columna a 3-1), el número de ciclo de los últimos paquetes quitadas de la cola numerada 1 persona (la numeración se inicia en 0). Esperamos que proyecto, como se muestra a continuación, cuando el número de ciclos de los dos paquetes numerados 0, el número de personas reportó un número de 0 a 2 y 0, cuando el registro 2 (M-1), el número de columna 0 , la última persona número restante 1, por lo que el número de personas de la última columna 1.

 

La derivación anterior se puede deducir fácilmente, cuando N = 3 en la fórmula:

Del mismo modo, también podemos deducir cuando el número de participantes es N, la fórmula personal última columna numerada:

De hecho, esta es una fórmula de recurrencia, la fórmula contiene las dos fórmulas siguientes:

 

 

(Mucha gente aquí no entienden por qué + M, por ejemplo, tenemos en cuenta que sólo dos personas numerados 0,1, M es igual a 3. Debido a que el último en salir del número de cola debe ser 0. Así la penúltima los números de cola debe ser 1, M más la naturaleza de que el M-1 primero unió a la columna, por lo que el M-ésimo de la última columna, y luego considerar la cola circular relación, así que tome el resto!)

 

Con este fórmulas de recursión, programa de diseño de nuevo muy simple puede ser utilizado para diseñar un programa de métodos recursivos, código específico como sigue:

  1. #include <stdio.h> 
  2. int main (void)  
  3. {  
  4.     int n, m, i, S = 0;  
  5.     la printf ( "Introduzca el número de columnas implicadas en la posición M y los valores n = ');  
  6.     scanf ( '% d% d', y n, y m);  
  7.       
  8.     printf ( 'la última persona fuera de la línea de la ubicación inicial es% d \ n', josephus (n, m));  
  9.     getch ();  
  10.     return 0;  
  11. }  
  12.  
  13. int josephus (int n, int m)  
  14. {  
  15.     si (n == 1)  
  16.         return 0;  
  17.     más  
  18.         retorno (josephus (n-1, m) m)% de N;  
  19. }  

En el código anterior, Josefo define una función recursiva () y, a continuación, llama a la función en la operación principal función.

Compiler realizar el procedimiento anterior, los valores de entrada de N y M, se puede obtener rápidamente el número final columna de las personas, la entrada de N = 8, M = 3, Figura 5-19 muestra los resultados obtenidos (nota numeración se inicia en 0) .

función recursiva ocupará más memoria de la computadora, cuando una jerarquía recursiva es demasiado profundo puede causar que el programa no se puede ejecutar, por lo tanto, el programa se puede escribir directamente en la siguiente forma recursiva:

  1. #include <stdio.h> 
  2. int main (void)  
  3. {  
  4.     int n, m, i, S = 0;  
  5.     la printf ( "Introduzca el número de columnas implicadas en la posición M y los valores n = ');  
  6.     scanf ( '% d% d', y n, y m);  
  7.     for (i = 2; i <= n; i)  
  8.         s = (sm)% i;  
  9.     printf ( 'la última persona fuera de la línea de la ubicación inicial es% d \ n', s);  
  10.     getch ();  
  11.     return 0;  
  12. }  

Los resultados de esta ejecución de código procedimiento recursivo y los resultados de la ejecución son idénticos.

Como puede verse, después de algún derivación matemática y, por último, una ley de procedimiento simplificado, de líneas de código decenas reduce a unas pocas líneas. Más importante aún, la eficiencia de la ejecución del programa han hecho grandes, lo que elimina una gran cantidad de ciclos repetitivos, incluso la resolución de grandes valores N y M, que no será un problema

Supongo que te gusta

Origin www.cnblogs.com/shaonianpi/p/12551193.html
Recomendado
Clasificación