一、问题描述
用java实现图灵机xn*2
二、问题分析
1.题目分析
首先将一个十进制数转化为二进制数再加上“,”,然后再根据将规则(1)(00,110,(逗号)110),使得转化的二进制转化为二进制编码,再将二进制编码按照以下指令
内态 输入内态 输出
0 00 0R,
0 11 0R,
1 00 1R,
1 110 0R,
10 011 1R,
11 00 1STOP.
将该二进制编码进行修正,再根据上面的规则1将该二进制编码进行收缩,最后转化为十进制数,看该十进制数是否乘了两倍。
2.流程图
三、测试结果
三、源代码
(1)进制转换类
package TurlingXn2;
import java.util.*;
/**
* @description:用java模拟图灵机xn*2
* @author: wkq
* @date: 2021/4/12
*/
public class BaseConver {
/**
* @description:将十进制数转换为二进制编码
* @param:十进制数deciMal
* @return:String
*/
public String toBincode (int deciMal){
String binCode="";//初始化二进制编码
String bin=Integer.toBinaryString(deciMal);//将十进制转化为二进制
bin += ",";//转换完之后加逗号
System.out.println("这个数的二进制表示为:" + bin);
for (int j = 0; j < bin.length(); j++) {
// 0 -> 0
if (bin.charAt(j) == '0') {
binCode += "0";
// 1 -> 10
} else if (bin.charAt(j) == '1') {
binCode += "10";
// , -> 110
} else if (bin.charAt(j) == ',') {
binCode += "110";
}
}
System.out.println("这个数的二进制编码表示为:" + binCode);
return binCode;
}
/**
* @description:将二进制编码转为十进制数
* @param:二进制编码:binCode
* @return:int
*/
public int toDeciMal(String binCode){
int deciMal=0;
String bin="";
//先将二进制编码收缩为二进制数
for(int i=0;i<binCode.length();i++){
//0->0
if(binCode.charAt(i)=='0'){
bin+="0";
}else if(binCode.charAt(i)=='1'&&binCode.charAt(i+1)=='0'){
//10->1;
bin+="1";
i++;
}else if(binCode.charAt(i)=='1'&&binCode.charAt(i+1)=='1'){
//110->,
//bin+=",";
i+=2;
break;
}
}
System.out.println("转化为二进制数字为"+bin);
deciMal=Integer.parseInt(bin,2);
System.out.println("转化为十进制数字为"+deciMal);
return deciMal;
}
}
(2)指令转换
public class TurlingInstrct {
//将二进制编码存储到数组当中
/**
* @description:根据指令:
* 00->00R
* 01->10R
* 10->01R
* 11->100R
* 100->111R
* 110->01STOP
* @param:二进制编码binCode
* @return:String
*/
public String toArrayList(String binCode) {
int inner = 0; // inner为内态
String q="";
for(int i=0; i<binCode.length(); i++)
{
if(binCode.charAt(i) == '0' && inner==0) // 输入为0,内态为0
{
q +="0" ;
inner = 0;
}
else if(binCode.charAt(i)=='0' && inner==1) // 输入为0,内态为1
{
q += "1";
inner = 0;
}
else if(binCode.charAt(i)=='0' && inner==10) // 输入为0,内态为10
{
break;//q+="1" ;
// inner = 11;
}
/*else if(binCode.charAt(i)=='0' && inner==11) // 输入为0,内态为11
{
q+= "1";
inner = 0;
}*/
else if(binCode.charAt(i)=='1'&& inner==0) // 输入为1,内态为0
{
q+= "0";
inner = 1;
}
else if(binCode.charAt(i)=='1' && inner==1) // 输入为1,内态为1
{
q+= "0";
inner = 10;
}
}
System.out.println("按照指令转化后的二进制编码为"+q);
return q;
}
}
(3)循环测试代码
package TurlingXn2;
public class LoopTest {
public static void main(String[]args){
for (int i=0;i<15;i++){
BaseConver p = new BaseConver();
String BinCode = p.toBincode(i);
TurlingInstrct m = new TurlingInstrct();
String k = m.toArrayList(BinCode);//根据指令将二进制编码进行改变
int j= p.toDeciMal(k);//转化为*2倍的十进制数进行验证
System.out.println (i+"---->"+BinCode+"---->"+k+"--->"+j);
System.out.println();
}
}
}
总结
通过这次对图灵机xn*2的代码实现,让我对图灵机模式有了更深刻的了解,在写这些代码的时候最重要的是要思路清晰,分步骤进行,结构化的设计,每设计完一个板块就进行板块测试,看是否能符合要求,最后检查结果是否正确。当时出现的最大问题就是在图灵指令的转换上面,将数字与字符混淆,使得出现错误较多。