问题描述:
对于XN*2图灵机进行模拟,任意给定的十进制数a,转换为收缩扩展二进制的编码,再编程模拟此Turing机的运行过程,要求输出从开始运行起的每一步骤的结果。 用java语言实现程序解决问题。
1.程序风格良好
2.提供友好的输入输出,并进行输入数据的正确性验证。
算法分析:
图灵机(XN*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’替换为’10’,’0’不变,’,’替换为’110’)
③:在扩展码上从左至右依次进行上述指令,第一个数值为内态,第二个为输入值,箭头后第一个数值为操作后的内态,第二个为输出值
④:将过程结果转换为二进制结果,再将二进制结果转换为十进制
⑤:最后输出十进制结果
流程图:
测试:
测试用例:17
输出结果应为:34
截图如下:
调试:
①:十进制数转换为二进制:
②:将二进制数转换为扩展码:
③:模拟图灵机XN*2运算:
④:将运算结果转换为二进制数:
⑤:将二进制数转换为十进制数:
源代码:
package tulingji;
import java.util.Scanner;
public class tulingji {
public static void main(String[] args) {
System.out.print("请输入一个十进制数:");
Scanner n = new Scanner(System.in);
//定义变量接收输入的十进制数
int ten = n.nextInt();
//调用进制转换函数将十进制转换为二进制
String two = Integer.toBinaryString(ten);
System.out.println("转换为的二进制数为:"+two);
//将字符串中所有的'1'转换为'10'
String str = two.replace("1","10");
StringBuffer str1 = new StringBuffer(str);
//模拟将最后的','转换为'110'
str1.append("11000");
System.out.println("替换后的二进制扩展码为:"+ str1);
//定义变量表示内态
int Flag=0;
//根据内态和输入不同选择不同的执行语句
for(int i=0;i<str1.length();i++){
if(Flag==0&&str1.charAt(i)=='0'){
Flag=0;
str1.setCharAt(i,'0');
System.out.println("内态为0,输入为0,经由指令后内态变为0,输出为0");
continue;
}
if(Flag==0&&str1.charAt(i)=='1'){
Flag=1;
str1.setCharAt(i,'0');
System.out.println("内态为0,输入为1,经由指令后内态变为1,输出为0");
continue;
}
if(Flag==1&&str1.charAt(i)=='0'){
Flag=0;
str1.setCharAt(i,'1');
System.out.println("内态为1,输入为0,经由指令后内态变为0,输出为1");
continue;
}
if(Flag==1&&str1.charAt(i)=='1'){
Flag=10;
str1.setCharAt(i,'0');
System.out.println("内态为1,输入为1,经由指令后内态变为10,输出为0");
continue;
}
if(Flag==10&&str1.charAt(i)=='0'){
Flag=11;
str1.setCharAt(i,'1');
System.out.println("内态为10,输入为0,经由指令后内态变为11,输出为1");
continue;
}
if(Flag==11&&str1.charAt(i)=='0'){
Flag=0;
str1.setCharAt(i,'1');
System.out.println("内态为11,输入为0,经由指令后内态变为0,输出为1");
break;
}
}
System.out.println("执行指令后的结果为:"+str1);
//模拟删除','的过程
str1.delete(str1.length()-3,str1.length());
String str2 = str1.toString().replace("10", "1");
System.out.println("转换为的二进制数为:"+ str2);
//将二进制数转换为十进制数并输出结果
int ten1=Integer.parseInt(str2,2);
System.out.println("最后的十进制结果为:"+ten1);
}
}
心得体会:
①:学习了数值转换函数的应用
②:学习了String类和StringBuffer 类的区别