MT Divisores con 1 Cinta
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.
Entre este estado Q0 y Q4 se procederá a calcular el número N/2 del número de la cadena de entrada y se escribirá ese resultado a la izquierda del número dado.
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.
Entre este estado Q8 y Q14 se hace la comprobación de los números que son divisores del número en la cadena de entrada.
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.