图灵机XN*2进行模拟

本文详细介绍了如何使用图灵机XN*2算法,将给定的十进制数转换为二进制编码,并模拟其运行过程,展示了从输入到输出的每一步操作。通过实例展示了Java编程实现,包括二进制编码转换、指令计算及结果还原的过程。
摘要由CSDN通过智能技术生成

图灵机XN*2进行模拟

基本要求: 对于XN*2图灵机进行模拟,任意给定的十进制数a,转换为收缩扩展二进制的编码,再编程模拟此Turing机的运行过程,要求输出从开始运行起的每一步骤的结果。

  1. 算法分析
    (1)二进制编码转换。
    接收一个十进制数的输入,转换为二进制数,按照0->0、1->01的规则进行数据替换,最后在末尾添加一个‘110’。
    (2)图灵机XN*2指令计算:
    0 0 ->0 0 R,
    0 1 ->1 0 R,
    1 0 ->0 1 R,
    1 1 ->10 0 R,
    10 0 ->11 1 R,
    11 0 ->0 1 STOP。
    根据指令来设置if else语句,来进行内态与输入的计较并且改变内态和输出。
    (3)输出最终结果:
    将指令计算结果首先删去末尾的‘110’, 按照0->0、01->1的规则转化为二进制数,再由二进制数转换为十进制数进行返回输出。
  2. 概要设计
    程序流程图输入需要计算的十进制数,将输入的数通过Binary()方法中Integer.toBinaryString(),转化为二进制数,然后用StringBuffer类replace将二进制数转化为二进制编码形式,将二进制编码通过Calcurlate()方法循环计算指令计算(用charAt()方法返回指定索引i处字符,setCharAt()设置当前索引处字符内容),break退出循环。最后将指令计算的结果通过Reduction()方法转换成十进制,输出结果。

下面是主程序

package 图灵机;
import java.util.Scanner;
public class Turing {
    //将整型十进制正数编码为所需要的二进制编码
    static StringBuffer Binary(int n){
        String str;
        //十进制转换为二进制表示的字符串
        str = Integer.toBinaryString(n);
        System.out.println("转换为二进制为:"+str);
        //转化成扩展二进制编码
        StringBuffer code = new StringBuffer(str.replace("1","10"));
        code.append("110");   //在扩展二进制编码后添加“110”表示“,”
        System.out.println("编码后为:" +code);
        return code;
    }
    //将编码进行乘2计算
    static void calculate(StringBuffer sb){
        int  flag = 0;        //设置内态变量
        //通过扩展二进制编码字符长度进行循环计算
        for(int i=0; i<sb.length(); i++){
         if(flag==0 & sb.charAt(i)=='0')     //0 0->0 0R
            {
                //flag = 0;
                sb.setCharAt(i,'0');
                continue;
            }
            if( flag==0 & sb.charAt(i)=='1')     //0 1->1 0R
            {
                flag = 1;
                sb.setCharAt(i,'0');
                continue;
            }
            if( flag==1 & sb.charAt(i)=='0')    //1 0->0 1R
            {
                flag = 0;
                sb.setCharAt(i,'1');
                continue;
            }
            if( flag==1 & sb.charAt(i)=='1')     //1 1->10 0R
            {
                flag = 10;
                sb.setCharAt(i,'0');
                continue;
            }
            if( flag==10 & sb.charAt(i)=='0')    //10 0R->11 1
            {
                flag = 11;
                sb.setCharAt(i,'1');
                continue;
            }

            if( flag==11 & sb.charAt(i)=='0')     //11 0->0 1STOP
            {
                sb.setCharAt(i,'1');
                break;
            }
        }
        System.out.println("计算结果为:" + sb);
    }
    //将二进制编码还原为整型十进制正数
    static void  Reduction(StringBuffer m)
    {
        m.delete(m.length()-1, m.length());  //将末尾的逗号去掉
        String s = m.toString().replace("10", "1"); //把扩展二进制编码的10替换成为1
        System.out.println("计算结果转换为二进制为:" + s );
        //Integer.parseInt方法,将结果转换为十进制
        int a=Integer.parseInt(s, 2);
        System.out.println("计算结果转换为十进制为:"+a);
    }

    public static void main(String[] args)
    {
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入要计算的数字:");
        if(sc.hasNextInt())
      {
        int num = sc.nextInt();
        StringBuffer sb = Binary(num);
        calculate(sb);
        Reduction(sb);
       }
        else
       { System.out.println("输入不合理,请重新输入"); }
    }
}
测试类

package 图灵机;
import java.util.Random;
public class Test extends Turing {
    static void test() {
        Random r = new Random();
        for (int i = 0; i < 5; i++)//随机生成5个数字
        {
            int t = r.nextInt(1000);//随机生成范围[0,1000)
            System.out.println("输入的数为: " + t);
            StringBuffer sb = Binary(t);
            calculate(sb);
            Reduction(sb);
        }
    }
}

测试结果
在这里插入图片描述

在这里插入图片描述

3.心得体会
对于“XN*2图灵机”问题,首先要理解图灵机的算法过程,一开始还有点迷迷糊糊的,后来再老师的一步步指导下,掌握了它的基本算法。然后在这次作业的主要用到了StringBuffer()类的一些方法,由于正巧Java课更好学到了这些知识,使得这次作业没有太大太困难的问题。但我也是第一次真正使用这些,需要考虑到的问题很多,不断的调试最后得到正确的结果。通过这次作业,我收获到了很多有用的知识,与此同时也发现自己的很多不足之处,基础知识掌握不牢固,不能学以致用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值