用Java模拟XN*2图灵机
Welocome to Xiang’s world~
内容:对于XN*2图灵机进行模拟,任意给定的十进制数,转换为收缩扩展二进制的编码,再编程模拟此Turing机的运行过程,要求输出从开始运行起的每一步骤的结果。用C或C++或Java或Python语言实现程序解决问题。
要求:1. 程序风格良好(使用自定义注释模板);2. 提供友好的输入输出,并进行输入数据的正确性验证。
①. 将输入的十进制数转换为二进制数;
② 将二进制数转换为收缩扩展二进制的编码;
③. 根据当前的内态和输入执行XN*2图灵机;
④. 将结果的二进制编码转换为二进制数;
⑤.将二进制数转换为十进制数,实现乘2运算功能。
import java.util.Scanner; /* 1. 将输入的十进制数转换为二进制数; 2. 将二进制数转换为收缩扩展二进制的编码; 3. 根据当前的内态和输入执行XN*2图灵机; 4. 将结果的二进制编码转换为二进制数; 5. 将二进制数转换为十进制数,实现乘2运算功能。 */ public class Main { public static void main(String[] args) { ShuZi shuZi=new ShuZi();//用户输入数字 int shuRu=0,neiTai=0;//neiTai为内态,shuRu为输入,进行初始化 shuZi.bianMa(); //创建三个字符串,①计算前的二进制编码②计算后的二进制编码③计算后的二进制数 String bianMaBefore=shuZi.getbianMacode(); String bianMaAfter=new String(); String binaryout=new String(); //输出 shuZi.bianMaPrint(); //进行图灵机XNx2规则 for(shuRu=0;shuRu<bianMaBefore.length();shuRu++) { //实现对二进制编码最后的动态加0 if(shuRu+1==bianMaBefore.length()){ bianMaBefore+="0"; } //charAt()方法:返回指定索引处的 char值 if(neiTai==0 && bianMaBefore.charAt(shuRu)=='0') { bianMaAfter+='0'; neiTai=0; continue; } else if(bianMaBefore.charAt(shuRu)=='1'&&neiTai==0) { bianMaAfter+='0'; neiTai=1; continue; } else if(neiTai==1&&bianMaBefore.charAt(shuRu)=='0') { bianMaAfter+='1'; neiTai=0; continue; } else if(neiTai==1&&bianMaBefore.charAt(shuRu)=='1') { neiTai=10; bianMaAfter+='0'; continue; } else if(neiTai==10&&bianMaBefore.charAt(shuRu)=='0') { neiTai=11; bianMaAfter+='1'; continue; } else if(neiTai==11&&bianMaBefore.charAt(shuRu)=='0') { neiTai=0; bianMaAfter+="10"; break; } } System.out.println("计算结果为:"+bianMaAfter); System.out.print("计算的二进制结果为:"); for(shuRu=0;shuRu<bianMaAfter.length();) { if(bianMaAfter.charAt(shuRu)!='1'){ shuRu++; } else{ System.out.print("1"); binaryout+="1"; shuRu++; break;} } //输出之后的二进制数 for(;shuRu<bianMaAfter.length();) { if(bianMaAfter.charAt(shuRu)=='0'&&bianMaAfter.charAt(shuRu+1)=='1') { if(bianMaAfter.charAt(shuRu+2)=='0'){ System.out.print("1"); binaryout+="1"; shuRu=shuRu+2; } else{ break; } } else { System.out.print("0"); binaryout+="0"; shuRu=shuRu+1;} } System.out.print("\n"); //输出转化为整数的结果 System.out.println("整数结果为:"+Integer.parseInt(binaryout,2)); } } //ShuZi类用来存放用户输入的十进制数,以及二进制数到二进制编码的转换。 class ShuZi { private int n;//用户输入的数 private String bianMa;//二进制数 private String bianMacode;//二进制编码 public ShuZi() { System.out.print("请输入一个正整数:"); Scanner input=new Scanner(System.in); //判断输入数的正确性 while(true) { n=input.nextInt(); if(n<=0) { System.out.println("请输入大于0的数:"); continue; } else break; } } public void bianMa() { //将正整数n转化为二进制字符串 bianMa=Integer.toBinaryString(n); bianMacode=new String(); bianMacode+="0"; //将二进制字符串转化为二进制编码字符串 for(int i=0;i<bianMa.length();i++) { if(bianMa.charAt(i)!='0') bianMacode+=bianMa.charAt(i)+"0"; else bianMacode+=bianMa.charAt(i); } bianMacode+="110"; } public void bianMaPrint() { System.out.print("此数的二进制形式为:"); System.out.println(bianMa); System.out.print("此数的二进制编码为:"); System.out.println(bianMacode); } //提取二进制编码 public String getbianMacode() { return bianMacode; } }
测试用例:-1,0,1,10000000000000000000000000000,1.2
输入的十进制数字:(有问题并且进行改正)
① 有问题前的代码
② 有问题前的运行结果(测试用例:-1)
③ 改正后的代码
④ 改正后的运行结果
调试二进制结果:
输出二进制的数:
输出转换十进制的结果:
解决思路:首先应该知道我们做的是xn*2的图灵机,我们应先输入一个十进制的数字,然后让他转换成二进制,但是图灵机的使用还需要给他的前面加上内态0,让其变成二进制编码,才能进行图灵机的规则转换。根据规则转换后,我们需要对其转换成二进制的模式,10位1,0为0,2为‘,’,最后转换为十进制数字。
步骤总结:
首先应该判断,输入的十进制数字是否合适,合适了才能进行接下来的操作。在进行判断的时候,因为条件过多,用if,else-if,else太容易搞混,不知道这个封装里面用啥,可以先把框架打好,在每一个条件里面先用注释表明是哪一个条件,然后再进行代码的补充。