Entrada : B0nB
Salida : B(0div1)1(0div2)1…1(0)1B
MT Estándar para calcular los Divisores de un Número N V2
Entrada: …Bq0000000000B…
Salida: …B0000$000000000$000101B…
| 0 | 1 | B | X | Y | $ |
Q0 | Q1, X, R | | Q5, $, L | Q0, X, R | | |
Q1 | Q2, X, L | | Q5, $, L | | | |
Q2 | | | Q3, $, L | Q2, X, L | | Q3, $, L |
Q3 | Q3, 0, L | | Q4, 0, R | | | |
Q4 | Q4, 0, R | | | | | Q0, $, R |
Q5 | | | | Q5, 0, L | | Q6, $, L |
| | | | | | |
Q6 | Q7, 0, L | | Q25, B, R | | | |
Q7 | Q7, 0, L | | Q8, B, R | | | |
| | | | | | |
| | | | | | |
| | | | | | |
Q8 | Q9, X, R | | | | | Q13, $, L |
Q9 | Q9, 0, R | | | | | Q10, $, R |
Q10 | Q11, Y, R | | | | Q10, Y, R | |
Q11 | Q12, 0, L | | | | | Q14, $, L |
| | | | | | |
Q12 | Q12, 0, L | | | Q8, X, R | Q12, Y, L | Q12, $, L |
| | | | | | |
Q13 | | | Q8, B, R | Q13, 0, L | | |
Q14 | Q15, 0, L | | | Q18, 0, L | Q14, 0, L | Q14, $, L |
| | | | | | |
Q15 | | | Q16, B, R | Q15, 0, L | | |
Q16 | Q17, B, R | | | | | |
Q17 | Q17, 0, L | | Q8, B, R | | | Q25, $, L |
Q18 | | | Q19, B, R | Q18, 0, L | | |
| | | | | | |
| | | | | | |
Q19 | Q20, X, R | | | | | Q22, $, R |
Q20 | Q20, 0, R | Q20, 1, R | Q21, 0, L | | | Q20, $, R |
Q21 | Q21, 0, L | Q21, 1, L | | Q19, X, R | | Q21, $, L |
| | | | | | |
Q22 | Q22, 0, R | Q22, 1, R | Q23, 1, L | | | Q22, $, R |
Q23 | Q23, 0, L | Q23, 1, L | | Q24, X, R | | Q23, $, L |
Q24 | | | | | | Q15, $, L |
Q25 | | | | | | |
Q0: Inicio de programa y control del bucle de división por 2.
En el estado Q0 se hace la primera marca X y control de salida del bucle ( Q5 ), reemplazando el símbolo B por $ con el fin de usarlo de separador entre el número N y bloque de resultados de los divisores de N.
Q1: Pone la segunda marca X.
Q2: Reemplaza el símbolo B por $ la primera vez que se pasa por aquí con el fin de utilizarlo como separador entre el número N y el bloque de N/2.
Q3: Escribir 0 donde haya B en el bloque de N/2 por cada iteración.
Q4: Volver al inicio del bucle.
Q5: Borra las marcas X dejándolas a 0.
Q6: Salir de la aplicación si no hay al menos un cero para evitar la “división por cero”.
Q7: Como mínimo habrá un cero y empezamos la comprobación de los divisores de N.
Q8: Inicio del bucle del cálculo de los divisores del número N.
En Q8 se controla el marcaje de X, es decir, si no hay más X volveremos a empezar el marcaje de las parejas Y.
En Q11 se controla el marcaje de Y, es decir, si no hay más Y entonces procederos a verificar si el número en cuestión es divisor del número N.
Q9: Buscar la marca $.
Q10: Marcamos con 0 con Y.
Q11: Comprobamos si hay más Y.
Q12: Retroceder hasta encontrar la marca X.
Q13: Se desmarcan las X y se vuelve a empezar con el proceso.
Q14: Se decide si el número realmente es un divisor de N ( Q18 ) ó no lo es ( Q15 ).
Q15: El número no era un divisor de N porque se encontró al menos un cero.
Q16: Decrementar en una unidad a N/2. El objetivo es eliminar todos los ceros.
Q17: Controla el final del programa ó la continuación con el cálculo de los divisores de N.
Q18: El número es un divisor de N porque se encontró al menos un X.
Q19: Iniciar la copia del divisor de N y control del final del proceso de copia ( Q22 ).
Entre este estado Q19 y Q21 se procederá copiar el número divisor de de N en el bloque de resultados, a la derecha del número dado.
Q20: Reemplazar B con 0.
Q21: Buscar X para volver a iniciar el marcaje ( Q19 ) .
Q22: Buscar el símbolo B y poner la marca de separación ( 1 ).
Q23: Buscar X en el bloque de números divisores ( N/2 ).
Q24: Volver a comprobar si aún quedan números en el bloque de N/2 ( Q15 ).
Q25: Estado Final. Finalizar programa.
3 comentarios:
Hemos probado con el 1 y funciona correctamente, luego hemos probado con el 4 y primero obteneis la cadena B00$0000$ pero luego vais tachando los primeros 0's por x y los otros por y quedando Bxx$yyyy$ y se recorren las y en el estado q10 y en este estado llegas al $ pero este estado no tiene definida la transicion para cuando lee el $.
La MT ya esta modificada
Bueno compañeros, aquí os ponemos más detalles de nuestra máquina.
Publicar un comentario