Java
“图灵机XN*2”用Java进行模拟:
问题描述
对于XN*2图灵机进行模拟,任意给定的十进制数a,转换为收缩扩展二进制的编码,再编程模拟此Turing机的运行过程,要求输出从开始运行起的每一步骤的结果。
提高要求:1.程序风格良好(使用自定义注释模板)。
2.提供友好的输入输出,并进行输入数据的正确性验证。
算法分析
0 0 —>0 0 R
0 1 —>1 0 R
1 0 —>0 1 R
1 1 —>10 0 R
10 0 —>11 1 R
11 0 —>0 1 Stop
(1)将十进制数转换为二进制数;
(2)将二进制数转换收缩扩展为二进制的编码;
(3)根据当前的内态和输入执行XN*2图灵机的指令;
(4)将结果的二进制编码转换为二进制数;
(5)将二进制数再转化为十进制数输出。
流程图
源代码实现
Turing.java
package sheji2;
import java.util.Scanner;
/**
* @author Chen
* @version 1.0
* @description .
* @date 2021-04-13 16:42
**/
public class Turing {
//将整型十进制正数编码为所需要的二进制原码
static StringBuffer turn(int a) {
String str;
str = Integer.toBinaryString(a); //返回int变量的二进制表示的字符串。
//转化成扩展二进制编码
StringBuffer s = new StringBuffer(str.replace("1", "10"));
s.append("11000"); //往转化的扩展二进制编码后添加“,”和补0的扩展二进制编码
return s;
}
/**
*
* @params [s]
* @author Chen
* @Description //TODO 进行图灵机模拟
* @date 2021/4/14 14:31
* @return java.lang.StringBuffer
*/
//将编码进行乘2计算
static StringBuffer calculate(StringBuffer s) {
int inVar = 0; //内态
//通过扩展二进制编码字符长度进行循环计算
for (int i = 0; i < s.length(); i++)
{
System.out.println();
//charAt()方法返回指定索引i处字符
//0 0 -> 0 0 R
if (inVar == 0 & s.charAt(i) == '0') {
inVar = 0;
s.setCharAt(i, '0');
System.out.println("内态为:0 输入为:0");
System.out.println("运算后为: " + s);
System.out.println("内态为: " + inVar + " 输出为:" + s.charAt(i));
//System.out.println();
continue;
}
//0 1 -> 1 0 R
if (inVar == 0 & s.charAt(i) == '1') {
inVar = 1;
s.setCharAt(i, '0');
System.out.println("内态为:0 输入为:1");
System.out.println("运算后为: " + s);
System.out.println("内态为: " + inVar + " 输出为:" + s.charAt(i));
continue;
}
//1 0 -> 0 1 R
if (inVar == 1 & s.charAt(i) == '0') {
inVar = 0;
s.setCharAt(i, '1');
System.out.println("内态为:1 输入为:0");
System.out.println("运算后为: " + s);
System.out.println("内态为: " + inVar + " 输出为:" + s.charAt(i));
continue;
}
//1 1 -> 10 0 R
if (inVar == 1 & s.charAt(i) == '1') {
inVar = 10;
s.setCharAt(i, '0');
System.out.println("内态为:1 输入为:1");
System.out.println("运算后为: " + s);
System.out.println("内态为:" + inVar + " 输出为:" + s.charAt(i));
continue;
}
//10 0 -> 11 1 R
if (inVar == 10 & s.charAt(i) == '0') {
inVar = 11;
s.setCharAt(i, '1');
System.out.println("内态为:10 输入为:0");
System.out.println("运算后为: " + s);
System.out.println("内态为:" + inVar + " 输出为:" + s.charAt(i));
continue;
}
//11 0 -> 0 1 Stop
if (inVar == 11 & s.charAt(i) == '0') {
inVar = 0;
s.setCharAt(i, '1');
System.out.println("内态为:11 输入为:0");
System.out.println("运算后为: " + s);
//System.out.println("内态为:" + inVar + " 输出为:" + s.charAt(i));
break;
}
}
return s;
}
/**
*
* @params [args]
* @author Chen
* @Description //TODO 主函数
* @date 2021/4/14 14:45
* @return void
*/
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
StringBuffer s = turn(num);
StringBuffer s1 = turn(num);
System.out.println("编码后为:" + s);
calculate(s);
System.out.println("计算结果为:" + s);
//将末尾的逗号去掉
s.delete(s.length() - 3, s.length());
//把10替换成为1
String t = s.toString().replace("10", "1");
System.out.println();
//还原计算结果
s.insert(s.length(),110);
String s2 = s.toString();
System.out.printf( num + " -> " + s1 + " -> " + s2 + " -> " + t + " -> " + Integer.parseInt(t, 2));
}
}