问题描述
对于XN+1或XN*2图灵机进行模拟,任意给定的十进制数a,转换为收缩扩展二进制的编码,再编程模拟此Turing机的运行过程,要求输出从开始运行起的每一步骤的结果。 用C或C++或java或python语言实现程序解决问题。
步骤:
1.算法分析
根据如下指令给出图灵机(XN×2)在扩展的二进位上实现这个运算的指令:
00→00R,
01→10R,
10→01R,
11→100R,
100→111R,
110→01STOP。
编码转换规则:
0→0;1→10;, →110;
分析:通过图灵机(XN×2) 在扩展二进位上的运算指令实现将二进制数乘2的运算。首先将所得到的十进制数转换成二进制数再转化为扩展二进制数,运算后得到结果再转化为十进制验证。
2.概设计
3.测试
测试0
测试正整数
测试负数
4.心得体会
在理解了图灵机的工作原理之后,通过分不同情况下分步计算即可得出相应的结果。
在程序设计中出现了进制转换相关的知识,还是需要查询相应的资料才能完好的实现功能。通过这些算法设计,对图灵机的工作原理有了一定的熟悉,这对以后的学习方面有着一定的帮助。
源代码
calculate类
package calculate;
public class calculate {
public String change1(int input) { //转换为二进制
String c1 = "0" + Integer.toinputString(input) + ",";
System.out.println("转换为二进制数:" + c1);
return c1;
}
public String change2(String s) { //转换为扩展二进制
String c2 = s.replace("1", "10").replace(",", "110");
System.out.println("转换为扩展二进制数:" + c2);
return c2;
}
public String calculate(String input) {
StringBuilder num = new StringBuilder(input);
int j = 0;
for (int i = 0; i < num.length(); i++) {
if (j== 0 && num.charAt(i) == '0') {
System.out.println("第" + (i + 1) + "次运算结果为:" + num);
continue;
} //00→00R,
if (j == 0 && num.charAt(i) == '1') {
j = 1;
num.setCharAt(i, '0');
System.out.println("第" + (i + 1) + "次运算结果为:" + num);
continue;
} //01→10R,
if (j == 1 && num.charAt(i) == '0') {
j = 0;
num.setCharAt(i, '1');
System.out.println("第" + (i + 1) + "次运算结果为:" + num);
continue;
} //10→01R,
if (j == 1 && num.charAt(i) == '1') {
j = 10;
num.setCharAt(i, '0');
System.out.println("第" + (i + 1) + "次运算结果为:" + num);
continue;
} //11→100R,
if (j == 10 && num.charAt(i) == '0') {
j = 11;
num.setCharAt(i, '1');
System.out.println("第" + (i + 1) + "次运算结果为:" + num);
continue;
} //100→111R,
if (j == 11 && num.charAt(i) == '0') {
j = 0;
num.setCharAt(i, '1');
System.out.println("第" + (i + 1) + "次运算结果为:" + num);
} //110→01STOP。
}
return num.toString();
}
public String change3(String input) {
int a = input.indexOf("1");
String c3 = input.substring(a, input.length() - 1).replace("10", "1") + ",";
System.out.println("转换为二进制数:" + c3);
return c3;
}
public int change4(String input) {
int c4 = Integer.parseInt(input.substring(0, input.length() - 1), 2);
System.out.println("转换为十进制数:" + c4);
return c4;
}
public int cal(int input) {
if (input < 0) {
System.out.println("不支持负数运算。");
return input;
}
if (input == 0) {
System.out.println("0*2=0");
return 0;
}
String a = change1(input); //二进制数
String b = change2(a); //扩展二进制数
String num = calculate(b); //计算
a = change3(num); //结果二进制数
input = change4(a); //结果十进制数
return input;
}
}
测试类
package calculate;
import java.util.Scanner;
public class test {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.print("输入一个十进制整数:");
int input = in.nextInt();
calculate c = new calculate();
c.cal(input);
}
}