前言
用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太容易搞混,不知道这个封装里面用啥,可以先把框架打好,在每一个条件里面先用注释表明是哪一个条件,然后再进行代码的补充。