我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何用Java模拟XN*2图灵机

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何用Java模拟XN*2图灵机

题目描述:

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

要求:1. 程序风格良好(使用自定义注释模板);

2. 提供友好的输入输出,并进行输入数据的正确性验证。

算法分析:

1. 将十进制数转换为二进制数;

2. 将二进制数转换为收缩扩展二进制的编码;

3. 根据当前的内态和输入执行XN*2图灵机的指令;

4. 将结果的二进制编码转换为二进制数;

5. 将二进制数转换为十进制数,实现乘2运算功能。

概要设计:

算法流程图如下:

测试:

输入的十进制数

正确的二进制编码

输出的二进制编码

正确的运算结果

输出的运算结果

0

0011000

0011000

0

0

3

0101011000

0101011000

6

6

18

0100010011000

0100010011000

36

36

运行结果:

调试:

①对调用指令的方法进行调试,开始时binCodeList的size为0,导致执行binCodeList.set(i, “0”)时出现错误,进过调试后发现是因为没给方法设置binCodeList的参数,导致方法中用的是类中空的binCodeList。在方法的参数中加上List<String> binCodeList就可以解决。

②对将二进制编码转换为十进制数的方法进行调试,开始时运算结果出现错误,调试后发现是判断第i个字符为1,第i+1个字符为0后,没有将i再加1,导致下次循环又遍历到i+1的0,于是有些步骤结果就会多出0。在if (binCode.charAt(i + 1) == '0'){…}代码块中加上i++就可以解决。

源代码:


import java.util.*; 

public class TuringMachine {
 
    private int internalState; // 图灵机的内态
    private String binCode; // 二进制编码
    Function f = new Function(); // 需要用到的方法
    List<String> binCodeList = new ArrayList<>(); // 用来存放二进制编码
 
    static int r = 0; // 当r为1时机器向右移动一格
    static int s = 0; // 当s为1时机器停止运行
 
    TuringMachine() {
        internalState = 0;
        binCode = "0";
    }
 
    public int getInternalState() {
        return internalState;
    }
 
    public void setInternalState(int internalState) {
        this.internalState = internalState;
    }
 
    public String getBinCode() {
        return binCode;
    }
 
    public void setBinCode(String binCode) {
        this.binCode = binCode;
    }
 
    
    public void runProcess(String binCode) {
        binCodeList = f.toArrayList(binCode); // 将二进制码binCode转换为ArrayList类型存放在binCodeList中
        // for循环对binCodeList进行遍历,根据当前内态的值判断该执行哪条指令
        for (int i = 0; i < binCodeList.size(); i++) {
            r = 1;
            // 当s==1时机器停止,跳出循环
            if (s == 1) {
                break;
            }
            switch (getInternalState()) {
                // 内态为0时执行指令1
                case 0:
                    instruction_1(binCodeList.get(i), i, binCodeList);
                    break;
                // 内态为1时执行指令2
                case 1:
                    instruction_2(binCodeList.get(i), i, binCodeList);
                    break;
                // 内态为10时执行指令3
                case 10:
                    instruction_3(binCodeList.get(i), i, binCodeList);
                    break;
                // 内态为11时执行指令4
                case 11:
                    instruction_4(binCodeList.get(i), i, binCodeList);
                    break;
                default:
                    break;
            }
        }
        System.out.println("XN*2图灵机计算的最终结果为:");
        f.toDecNum(f.toString(binCodeList)); // 将binCodeList转换为String类型的二进制编码binCode,再转换为int类型的十进制数decNum
    } 
    
    private void instruction_1(String input, int i, List<String> binCodeList) {
        System.out.println("当前的内态为:" + getInternalState() + ",输入为:" + input);
        if (input.equals("0")) {
            System.out.println("执行此条指令后的内态为:" + getInternalState() + ",输入为:" + binCodeList.get(i) + ",右移");
            System.out.println("此步骤的结果为:");
            System.out.println(f.toString(binCodeList));
        }
        if (input.equals("1")) {
            setInternalState(1);
            binCodeList.set(i, "0");
            System.out.println("执行此条指令后的内态为:" + getInternalState() + ",输入为:" + binCodeList.get(i) + ",右移");
            System.out.println("此步骤的结果为:");
            System.out.println(f.toString(binCodeList));
        }
        System.out.println();
    }
 
    private void instruction_2(String input, int i, List<String> binCodeList) {
        System.out.println("当前的内态为:" + getInternalState() + ",输入为:" + input);
        if (input.equals("0")) {
            setInternalState(0);
            binCodeList.set(i, "1");
            System.out.println("执行此条指令后的内态为:" + getInternalState() + ",输入为:" + binCodeList.get(i) + ",右移");
            System.out.println("此步骤的结果为:");
            System.out.println(f.toString(binCodeList));
        }
        if (input.equals("1")) {
            setInternalState(10);
            binCodeList.set(i, "0");
            System.out.println("执行此条指令后的内态为:" + getInternalState() + ",输入为:" + binCodeList.get(i) + ",右移");
            System.out.println("此步骤的结果为:");
            System.out.println(f.toString(binCodeList));
        }
        System.out.println();
    }
 
    private void instruction_3(String input, int i, List<String> binCodeList) {
        System.out.println("当前的内态为:" + getInternalState() + ",输入为:" + input);
        if (input.equals("0")) {
            setInternalState(11);
            binCodeList.set(i, "1");
            System.out.println("执行此条指令后的内态为:" + getInternalState() + ",输入为:" + binCodeList.get(i) + ",右移");
            System.out.println("此步骤的结果为:");
            System.out.println(f.toString(binCodeList));
        }
        System.out.println();
    }
 
    private void instruction_4(String input, int i, List<String> binCodeList) {
        System.out.println("当前的内态为:" + getInternalState() + ",输入为:" + input);
        if (input.equals("0")) {
            setInternalState(0);
            binCodeList.set(i, "1");
            System.out.println("执行此条指令后的内态为:" + getInternalState() + ",输入为:" + binCodeList.get(i) + ",STOP");
            System.out.println("此步骤的结果为:");
            System.out.println(f.toString(binCodeList));
        }
        s = 1;
        System.out.println();
    }
 
    public static void main(String[] args) {
        TuringMachine tm = new TuringMachine(); // 创建TuringMachine的实例tm
        System.out.println("请输入一个十进制数:");
        Scanner scanner = new Scanner(System.in);
        try {
            int decNum = scanner.nextInt();
            tm.setBinCode(tm.f.toBinCode(decNum)); // 将十进制数转换为二进制编码并赋值给binCode
            System.out.println();
            tm.runProcess(tm.getBinCode()); // 运行图灵机
        } catch (InputMismatchException ex) {
            System.out.println("输入有误!");
        }
    } 
}
 

class Function {
 
    
    public String toBinCode(int decNum) {
        String binCode = "";
        String binNum = Integer.toBinaryString(decNum); // 十进制数转换为二进制数
        binNum += ","; // 用,标识此二进制数到此已完整,后面的0都忽略不计
        System.out.println("这个数的二进制表示为:" + binNum);
        // 利用for循环对二进制数binNum中的字符进行遍历,根据其中的每个字符得出二进制编码binCode
        for (int i = 0; i < binNum.length(); i++) {
            // 0 -> 0
            if (binNum.charAt(i) == '0') {
                binCode += "0";
                // 1 -> 10
            } else if (binNum.charAt(i) == '1') {
                binCode += "10";
                // , -> 110
            } else if (binNum.charAt(i) == ',') {
                binCode += "110";
            }
        }
        binCode = "0" + binCode + "00";
        System.out.println("这个数的二进制编码为:" + binCode);
        return binCode;
    }
 
    
    public int toDecNum(String binCode) {
        int decNum = 0;
        String binNum = "";
        // 先利用for循环对ArrayList类型的binCode进行遍历,根据其中的每个元素得出二进制编码binCode
        for (int i = 0; i < binCode.length(); i++) {
            // 0 -> 0
            if (binCode.charAt(i) == '0') {
                binNum += "0";
            } else if (binCode.charAt(i) == '1') {
                // 10 -> 1
                if (binCode.charAt(i + 1) == '0') {
                    binNum += "1";
                    i++;
                    // 110 -> ,
                } else if (binCode.charAt(i + 1) == '1') {
                    binNum += ",";
                    break;
                }
            }
        }
        System.out.println("二进制表示:" + binNum);
        decNum = Integer.parseInt(binNum.substring(0, binNum.length() - 1), 2); // 将二进制编码binCode转化为十进制数
        System.out.println("十进制表示:" + decNum);
        return decNum;
    }
 
    
    public List<String> toArrayList(String binCode) {
        binCode = binCode.replaceAll("", " ").trim(); // 将binCode中的每个字符用空格分隔开,并去掉首尾的空格
        // 根据分隔符空格分隔出binCode中的每个字符存放到binCodeList中
        List<String> binCodeList = new ArrayList<>(Arrays.asList(binCode.split(" ")));
        return binCodeList;
    }
 
    
    public String toString(List<String> binCodeList) {
        String binCode = String.join("", binCodeList);
        return binCode;
    } 
}

总结

本次测试是模拟图灵机对十进制数进行乘2运算,并输出每一步骤的结果。

本次测试的关键问题在于图灵机运行过程和算法的理解,图灵机判断当前内态和输入后执行指令,在这里我才用switch语句根据内态的值判断执行哪个指令方法,再根据输入判断具体执行什么指令,通过for循环模拟右移操作。到此这篇关于如何用Java模拟XN*2图灵机的文章就介绍到这了,更多相关Java内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何用Java模拟XN*2图灵机

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java如何实现ATM机模拟系统

这篇“Java如何实现ATM机模拟系统”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java如何实现ATM机模拟系统”文章吧
2023-07-02

Java如何利用随机分钱模拟财富变化

这篇“Java如何利用随机分钱模拟财富变化”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java如何利用随机分钱模拟财富变化
2023-07-04

Python如何使用微信接入图灵机器人

本篇内容主要讲解“Python如何使用微信接入图灵机器人”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python如何使用微信接入图灵机器人”吧!1.wxpy库介绍wxpy 在 itchat 的
2023-06-02

如何使用java模拟简单的tomcat方法

本篇内容介绍了“如何使用java模拟简单的tomcat方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!我们现在已经会使用tomcat了,但
2023-06-29

如何查看虚拟主机的可用模块

要查看虚拟主机的可用模块,可以使用以下步骤:1. 登录到虚拟主机的控制面板或通过SSH远程连接到虚拟主机的服务器。2. 打开虚拟主机的配置文件。根据使用的服务器软件,配置文件的位置可能不同。常见的配置文件是Apache的httpd.conf
2023-08-08

如何在 Golang 中使用随机数进行模拟?

使用 math/rand 包进行随机数模拟:导入 math/rand 包。使用 time.now().unixnano() 初始化随机数生成器。使用 rand.intn(n) 生成 0 到 n-1 之间的随机整数。使用 rand.float
如何在 Golang 中使用随机数进行模拟?
2024-05-13

如何在java虚拟机中使用jvm方法

这篇文章主要介绍了如何在java虚拟机中使用jvm方法,编程网小编觉得不错,现在分享给大家,也给大家做个参考,一起跟随编程网小编来看看吧!使用下面代码:for (int i = 0; i <10000; i++) {CglibWapper
2023-06-06

java如何使用多线程模拟抢红包功能

这篇文章主要为大家展示了“java如何使用多线程模拟抢红包功能”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“java如何使用多线程模拟抢红包功能”这篇文章吧。今天有朋友问我一道面试题,有5个人抢
2023-05-30

Vue3+Vite项目如何使用mockjs随机模拟数据

今天小编给大家分享一下Vue3+Vite项目如何使用mockjs随机模拟数据的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。在
2023-07-05

如何有效利用软考模拟机考进行复习

有效利用软考模拟机考进行复习,是备考软考的重要策略之一。以下是一些详细的建议,帮助考生充分利用软考模拟机考资源,提高复习效率和考试通过率。
如何有效利用软考模拟机考进行复习
2024-10-08

利用Java+Selenium+OpenCV模拟如何实现网页滑动验证

本篇文章给大家分享的是有关利用Java+Selenium+OpenCV模拟如何实现网页滑动验证,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。目前很多网页都有滑动验证,目的就是防
2023-06-26

如何使用js模拟实现京东详情页图片放大效果

这篇文章给大家分享的是有关如何使用js模拟实现京东详情页图片放大效果的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。具体内容如下效果:html:
2023-06-25

在java项目中使用 Socket如何实现模拟一个HTTP服务器

这篇文章给大家介绍在java项目中使用 Socket如何实现模拟一个HTTP服务器,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。HTTP基于TCP协议,协议采用了请求/响应模型。客户端向服务器发送一个请求,请求头包含请
2023-05-31

如何探讨Java代理模式与反射机制的实际应用

如何探讨Java代理模式与反射机制的实际应用,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Java提供了一套机制来动态执行方法和构造方法,以及数组操作等,这套机制就叫反射。而代
2023-06-17

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录