2021-04-13


一、问题描述

用java实现图灵机xn*2

二、问题分析

1.题目分析

首先将一个十进制数转化为二进制数再加上“,”,然后再根据将规则(1)(00,110,(逗号)110),使得转化的二进制转化为二进制编码,再将二进制编码按照以下指令
内态 输入内态 输出
0 00 0R,
0 11 0R,
1 00 1R,
1 110 0R,
10 011 1R,
11 00 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的代码实现,让我对图灵机模式有了更深刻的了解,在写这些代码的时候最重要的是要思路清晰,分步骤进行,结构化的设计,每设计完一个板块就进行板块测试,看是否能符合要求,最后检查结果是否正确。当时出现的最大问题就是在图灵指令的转换上面,将数字与字符混淆,使得出现错误较多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值