用java模拟XN*2图灵机

前言

用Java模拟XN*2图灵机

Welocome to Xiang’s world~

题目♥

内容:对于XN*2图灵机进行模拟,任意给定的十进制数,转换为收缩扩展二进制的编码,再编程模拟此Turing机的运行过程,要求输出从开始运行起的每一步骤的结果。用C或C++或Java或Python语言实现程序解决问题。

要求:1. 程序风格良好(使用自定义注释模板);2. 提供友好的输入输出,并进行输入数据的正确性验证。

分析♥

①. 将输入的十进制数转换为二进制数;
② 将二进制数转换为收缩扩展二进制的编码;
③. 根据当前的内态和输入执行XN*2图灵机;
④. 将结果的二进制编码转换为二进制数;
⑤.将二进制数转换为十进制数,实现乘2运算功能。

流程图

用java模拟XN*2图灵机

代码♥

用java模拟XN*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
用java模拟XN*2图灵机
用java模拟XN*2图灵机
用java模拟XN*2图灵机

调试

输入的十进制数字:(有问题并且进行改正)
① 有问题前的代码
用java模拟XN*2图灵机

② 有问题前的运行结果(测试用例:-1)
用java模拟XN*2图灵机

③ 改正后的代码
用java模拟XN*2图灵机

④ 改正后的运行结果
用java模拟XN*2图灵机

调试二进制结果:
用java模拟XN*2图灵机

输出二进制的数:
用java模拟XN*2图灵机

输出转换十进制的结果:
用java模拟XN*2图灵机

心得体会

解决思路:首先应该知道我们做的是xn*2的图灵机,我们应先输入一个十进制的数字,然后让他转换成二进制,但是图灵机的使用还需要给他的前面加上内态0,让其变成二进制编码,才能进行图灵机的规则转换。根据规则转换后,我们需要对其转换成二进制的模式,10位1,0为0,2为‘,’,最后转换为十进制数字。
步骤总结:
首先应该判断,输入的十进制数字是否合适,合适了才能进行接下来的操作。在进行判断的时候,因为条件过多,用if,else-if,else太容易搞混,不知道这个封装里面用啥,可以先把框架打好,在每一个条件里面先用注释表明是哪一个条件,然后再进行代码的补充。

上一篇:LeetCode-389-找不同


下一篇:5. 最长回文子串_字符串_中等