##图灵机模拟运算XN2(java实现)
题目:对于XN2图灵机进行模拟,任意给定的十进制数a,转换为收缩扩展二进制的编码,再编程模拟此Turing机的运行过程,要求输出从开始运行起的每一步骤的结果。
输入格式:
输入一个正整数
输入样例:
16
167
输出样例:
16
内态:0输入:1
第1步结果为:0000001100
内态变为:1输入变为:0
第2步结果为:0100001100
内态变为:0输入变为:1
第3步结果为:0100001100
内态变为:0输入变为:0
第4步结果为:0100001100
内态变为:0输入变为:0
第5步结果为:0100001100
内态变为:0输入变为:0
第6步结果为:0100001100
内态变为:0输入变为:0
第7步结果为:0100000100
内态变为:1输入变为:0
第8步结果为:0100000000
内态变为:10输入变为:0
第9步结果为:0100000010
内态变为:11输入变为:1
第10步结果为:0100000011
内态变为:0输入变为:1
结果的二进制编码:100000
最终答案:32
167
内态:0输入:1
第1步结果为:00010001010101100
内态变为:1输入变为:0
第2步结果为:01010001010101100
内态变为:0输入变为:1
第3步结果为:01010001010101100
内态变为:0输入变为:0
第4步结果为:01000001010101100
内态变为:1输入变为:0
第5步结果为:01001001010101100
内态变为:0输入变为:1
第6步结果为:01001001010101100
内态变为:0输入变为:0
第7步结果为:01001001010101100
内态变为:0输入变为:0
第8步结果为:01001000010101100
内态变为:1输入变为:0
第9步结果为:01001000110101100
内态变为:0输入变为:1
第10步结果为:01001000100101100
内态变为:1输入变为:0
第11步结果为:01001000101101100
内态变为:0输入变为:1
第12步结果为:01001000101001100
内态变为:1输入变为:0
第13步结果为:01001000101011100
内态变为:0输入变为:1
第14步结果为:01001000101010100
内态变为:1输入变为:0
第15步结果为:01001000101010000
内态变为:10输入变为:0
第16步结果为:01001000101010010
内态变为:11输入变为:1
第17步结果为:01001000101010011
内态变为:0输入变为:1
结果的二进制编码:101001110
最终答案:334
代码
public class sss {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//输入一个整数
int i = sc.nextInt();
while(i < 0){
System.out.println("请重新输入一个大于0的整数");
i = sc.nextInt();
}
//将其转换为二进制字符串常量str1
String str1 = Integer.toBinaryString(i);
//定义一个StringBuffer类的空的可变字符串str
StringBuffer str2 = new StringBuffer();
//遍历str1 判断01,向str2中添加‘10'或者'0',生成伸缩扩展二进制编码str2
for(int x = 0 ;x <str1.length();x++){
if(str1.charAt(x) == '1')
str2.append("10");
if(str1.charAt(x) == '0')
str2.append("0");
}
//向str2后面添加'1100',作为计算后续的结束标志
str2.append("1100");
//初始化内态n等于0
String n = "0";
System.out.println("内态:"+n+"输入:"+str2.charAt(0));
//进行XN*2的操作
for(int x = 0 ; x < str2.length();x++){
if(n == "0" && str2.charAt(x) == '0'){
n = "0";
str2.setCharAt(x,'0');
}
else if(n == "0" && str2.charAt(x) == '1'){
n = "1";
str2.setCharAt(x,'0');
}else if(n == "1" && str2.charAt(x) == '0'){
n = "0";
str2.setCharAt(x,'1');
}else if(n == "1" && str2.charAt(x) == '1'){
n = "10";
str2.setCharAt(x,'0');
}else if(n == "10" && str2.charAt(x) == '0'){
n = "11";
str2.setCharAt(x,'1');
}else if(n == "11" && str2.charAt(x) == '0'){
n = "0";
str2.setCharAt(x,'1');
}
System.out.println("第"+(x+1)+"步结果为:"+str2);
System.out.println("内态变为:"+n+"输入变为:"+str2.charAt(x));
}
//定义一个ans 存储最终结果
StringBuffer ans = new StringBuffer("");
int a = 0,b = 1;
//伸缩扩展二进制码转换为二进制码
while(true)
{
if(str2.charAt(a) == '1'&& str2.charAt(b)=='0')
ans.append('1');
else if(str2.charAt(a) == '0'&& str2.charAt(b)=='0')
ans.append('0');
else if(str2.charAt(a) == '1'&& str2.charAt(b)=='1')
break;
a++;
b++;
}
System.out.println("结果的二进制编码:"+ans);
System.out.println("最终答案:"+Integer.parseInt(ans.toString(),2));
}
}