lunes, 14 de abril de 2008

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.

3 comentarios:

Pedro dijo...

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 $.

Enrique Dosda Verge dijo...

La MT ya esta modificada

Lord Garfio dijo...

Bueno compañeros, aquí os ponemos más detalles de nuestra máquina.