“图灵机XN*2”用Java进行模拟

Java

“图灵机XN*2”用Java进行模拟:


问题描述

  对于XN*2图灵机进行模拟,任意给定的十进制数a,转换为收缩扩展二进制的编码,再编程模拟此Turing机的运行过程,要求输出从开始运行起的每一步骤的结果。
  提高要求:1.程序风格良好(使用自定义注释模板)。
       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
(1)将十进制数转换为二进制数;
(2)将二进制数转换收缩扩展为二进制的编码;
(3)根据当前的内态和输入执行XN*2图灵机的指令;
(4)将结果的二进制编码转换为二进制数;
(5)将二进制数再转化为十进制数输出。


流程图

在这里插入图片描述


源代码实现

Turing.java

package sheji2;

import java.util.Scanner;
/**
 * @author Chen
 * @version 1.0
 * @description .
 * @date 2021-04-13 16:42
 **/

public class Turing {
    //将整型十进制正数编码为所需要的二进制原码
    static StringBuffer turn(int a) {
        String str;
        str = Integer.toBinaryString(a);         //返回int变量的二进制表示的字符串。
        //转化成扩展二进制编码
        StringBuffer s = new StringBuffer(str.replace("1", "10"));
        s.append("11000");             //往转化的扩展二进制编码后添加“,”和补0的扩展二进制编码
        return s;
    }

    /**
     *
     * @params [s]
     * @author Chen
     * @Description //TODO 进行图灵机模拟
     * @date 2021/4/14 14:31
     * @return java.lang.StringBuffer
     */
    //将编码进行乘2计算
    static StringBuffer calculate(StringBuffer s) {
        int inVar = 0;        //内态
        //通过扩展二进制编码字符长度进行循环计算
        for (int i = 0; i < s.length(); i++)
        {
            System.out.println();
            //charAt()方法返回指定索引i处字符
            //0 0 -> 0 0 R
            if (inVar == 0 & s.charAt(i) == '0') {
                inVar = 0;
                s.setCharAt(i, '0');
                System.out.println("内态为:0 输入为:0");
                System.out.println("运算后为: " + s);
                System.out.println("内态为: " + inVar + " 输出为:" + s.charAt(i));
                //System.out.println();
                continue;
            }
            //0 1 -> 1 0 R
            if (inVar == 0 & s.charAt(i) == '1') {
                inVar = 1;
                s.setCharAt(i, '0');
                System.out.println("内态为:0 输入为:1");
                System.out.println("运算后为: " + s);
                System.out.println("内态为: " + inVar + " 输出为:" + s.charAt(i));
                continue;
            }
            //1 0 -> 0 1 R
            if (inVar == 1 & s.charAt(i) == '0') {
                inVar = 0;
                s.setCharAt(i, '1');
                System.out.println("内态为:1 输入为:0");
                System.out.println("运算后为: " + s);
                System.out.println("内态为: " + inVar + " 输出为:" + s.charAt(i));
                continue;
            }
            //1 1 -> 10 0 R
            if (inVar == 1 & s.charAt(i) == '1') {
                inVar = 10;
                s.setCharAt(i, '0');
                System.out.println("内态为:1 输入为:1");
                System.out.println("运算后为: " + s);
                System.out.println("内态为:" + inVar + " 输出为:" + s.charAt(i));
                continue;
            }
            //10 0 -> 11 1 R
            if (inVar == 10 & s.charAt(i) == '0') {
                inVar = 11;
                s.setCharAt(i, '1');
                System.out.println("内态为:10 输入为:0");
                System.out.println("运算后为: " + s);
                System.out.println("内态为:" + inVar + " 输出为:" + s.charAt(i));
                continue;
            }
            //11 0 -> 0 1 Stop
            if (inVar == 11 & s.charAt(i) == '0') {
                inVar = 0;
                s.setCharAt(i, '1');
                System.out.println("内态为:11 输入为:0");
                System.out.println("运算后为: " + s);
                //System.out.println("内态为:" + inVar + " 输出为:" + s.charAt(i));
                break;
            }
        }
        return s;
    }

    /**
     *
     * @params [args]
     * @author Chen
     * @Description //TODO 主函数
     * @date 2021/4/14 14:45
     * @return void
     */
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();
        StringBuffer s = turn(num);
        StringBuffer s1 = turn(num);
        System.out.println("编码后为:" + s);
        calculate(s);
        System.out.println("计算结果为:" + s);
        //将末尾的逗号去掉
        s.delete(s.length() - 3, s.length());
        //把10替换成为1
        String t = s.toString().replace("10", "1");
        System.out.println();
        //还原计算结果
        s.insert(s.length(),110);
        String s2 = s.toString();
        System.out.printf(  num + " -> " + s1 + " -> " + s2 + " -> " + t + " -> " + Integer.parseInt(t, 2));
    }
}

运行结果

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值