模拟Xn*2图灵机 java实现
对于给定的一台图灵机(XN*2)和任意给定的一个整数,编程模拟此图灵机的运行过程,要求输出从开始运行起的每一步骤的结果。
流程图分析:
java代码实现
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;
public class turing {
public static void main (String[] args) {
System.out.println("输入一个整数(十进制)");
Scanner scanner = new Scanner(System.in);
int a = scanner.nextInt();
restore(turing_change(change1(a)));
}
// change1 函数用来将整数转换为图灵机需要的初始二进制数
public static List change1 (int x) {
String A = Integer.toBinaryString(x);
System.out.println("未扩展的二进制数为:" + A.toString());
char[] B = A.toCharArray();
// 建一个list C用来存放转换后的二进制数
List<String> C = new ArrayList<>();
// 内态初始为0,因此在最开始先添加一个0
C.add(0, "0");
for (int i = 0; i < B.length; i++) {
if (B[i] == '0') {
C.add("0");
} else if (B[i] == '1') {
C.add("10");
}
}
C.add("11000");
System.out.println("图灵机所需的二进制数为:" + C.toString());
return C;
}
// turing_change 函数用来进行内态以及扩展码的处理
public static char[] turing_change (List X) {
int inner = 0;
StringBuilder sb = new StringBuilder();
for (Object x : X) {
sb.append(x);
}
System.out.println(sb);
char[] array = sb.toString().toCharArray();
for (int i = 0; i < array.length; i++) {
System.out.println("当前内态为:" + inner + " 当前的扩展码为:" + sb);
if (array[i] == '0' && inner == 0) {
inner = 0;
array[i] = '0';
} else if (array[i] == '1' && inner == 0) {
inner = 1;
array[i] = '0';
} else if (array[i] == '0' && inner == 1) {
inner = 0;
array[i] = '1';
} else if (array[i] == '1' && inner == 1) {
inner = 10;
array[i]='0';
} else if (array[i] == '0' && inner == 10) {
inner = 11;
array[i] = '1';
} else if (array[i] == '0' && inner == 11) {
inner = 0;
array[i] = '1';
}
}
return array;
}
// restore 函数用来对扩展码二进制数进行还原,变成正常的二进制数
public static void restore (char[] X) {
int start = 0;
int size = X.length;
ArrayList<Character> array2 = new ArrayList<>();
int i = 0;
while (start < size) {
if (X[start] == '0') {
array2.add('0');
start += 1;
} else if (start + 1 < size && X[start] == '1' && X[start + 1] == '0') {
array2.add('1');
start += 2;
} else if (start + 2 < size && X[start] == '1' && X[start + 1] == '1' && X[start + 2] == '0') {
start += 3;
}
}
StringBuilder s = new StringBuilder();
for(char x: array2) {
s.append(x);
}
System.out.println("经过图灵机计算得到的二进制数为:" + s);
System.out.println("最后由图灵机得到的数为:" + Integer.parseInt(s.toString(), 2));
}
}
代码调试
总结
使用java实现图灵机的过程中,由于字符串无法进行逐个字符比较,所以我采用了方法tocharArray()先对字符串进行数组转换,然后按照迭代方法进行图灵机转换,并且采用list列表来存储每个图灵机变换的二进制数位,最后输出的时候使用toString() 方法输出字符串。这个过程中遇到了一些问题,都是由于对java的类型转换方法不熟悉造成,这次练习使得我对一些java的类型转换方法的了解更进一步。