2021-04-14

模拟Xn*2图灵机 java实现

对于给定的一台图灵机(XN*2)和任意给定的一个整数,编程模拟此图灵机的运行过程,要求输出从开始运行起的每一步骤的结果。
流程图分析:
在这里插入图片描述

java代码实现

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;


public class turing {
    public static void main (String[] args) {
        System.out.println("输入一个整数(十进制)");
        Scanner scanner = new Scanner(System.in);
        int a = scanner.nextInt();

        restore(turing_change(change1(a)));

    }


    // change1 函数用来将整数转换为图灵机需要的初始二进制数
    public static List change1 (int x) {
        String A = Integer.toBinaryString(x);
        System.out.println("未扩展的二进制数为:" + A.toString());
        char[] B = A.toCharArray();
        // 建一个list C用来存放转换后的二进制数
        List<String> C = new ArrayList<>();
        // 内态初始为0,因此在最开始先添加一个0
        C.add(0, "0");
        for (int i = 0; i < B.length; i++) {
            if (B[i] == '0') {
                C.add("0");

            } else if (B[i] == '1') {
                C.add("10");
            }
        }
        C.add("11000");
        System.out.println("图灵机所需的二进制数为:" + C.toString());
        return C;
    }

    // turing_change 函数用来进行内态以及扩展码的处理
    public static char[] turing_change (List X) {
        int inner = 0;
        StringBuilder sb = new StringBuilder();
        for (Object x : X) {
            sb.append(x);
        }
        System.out.println(sb);
        char[] array = sb.toString().toCharArray();
        for (int i = 0; i < array.length; i++) {
            System.out.println("当前内态为:" + inner + " 当前的扩展码为:" + sb);
            if (array[i] == '0' && inner == 0) {
                inner = 0;
                array[i] = '0';
            } else if (array[i] == '1' && inner == 0) {
                inner = 1;
                array[i] =  '0';
            } else if (array[i] == '0' && inner == 1) {
                inner = 0;
                array[i] = '1';
            } else if (array[i] == '1' && inner == 1) {
                inner = 10;
                array[i]='0';
            } else if (array[i] == '0' && inner == 10) {
                inner = 11;
                array[i] = '1';
            } else if (array[i] == '0' && inner == 11) {
                inner = 0;
                array[i] = '1';
            }


        }
        return array;
    }

    // restore 函数用来对扩展码二进制数进行还原,变成正常的二进制数
    public static void restore (char[] X) {
        int start = 0;
        int size = X.length;
        ArrayList<Character> array2 = new ArrayList<>();

        int i = 0;
        while (start < size) {

            if (X[start] == '0') {
                array2.add('0');
                start += 1;

            } else if (start + 1 < size && X[start] == '1' && X[start + 1] == '0') {
                array2.add('1');
                start += 2;
            } else if (start + 2 < size && X[start] == '1' && X[start + 1] == '1' && X[start + 2] == '0') {
                start += 3;
            }
        }
        StringBuilder s = new StringBuilder();
        for(char x: array2) {
            s.append(x);
        }
        System.out.println("经过图灵机计算得到的二进制数为:" + s);
        System.out.println("最后由图灵机得到的数为:" + Integer.parseInt(s.toString(), 2));


    }


}


代码调试
在这里插入图片描述
总结
使用java实现图灵机的过程中,由于字符串无法进行逐个字符比较,所以我采用了方法tocharArray()先对字符串进行数组转换,然后按照迭代方法进行图灵机转换,并且采用list列表来存储每个图灵机变换的二进制数位,最后输出的时候使用toString() 方法输出字符串。这个过程中遇到了一些问题,都是由于对java的类型转换方法不熟悉造成,这次练习使得我对一些java的类型转换方法的了解更进一步。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值