如何使用Java模拟XN*2图灵机
发表于:2025-02-11 作者:千家信息网编辑
千家信息网最后更新 2025年02月11日,本文小编为大家详细介绍"如何使用Java模拟XN*2图灵机",内容详细,步骤清晰,细节处理妥当,希望这篇"如何使用Java模拟XN*2图灵机"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来
千家信息网最后更新 2025年02月11日如何使用Java模拟XN*2图灵机
本文小编为大家详细介绍"如何使用Java模拟XN*2图灵机",内容详细,步骤清晰,细节处理妥当,希望这篇"如何使用Java模拟XN*2图灵机"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。
题目描述:
对于XN*2图灵机进行模拟,任意给定的十进制数,转换为收缩扩展二进制的编码,再编程模拟此Turing机的运行过程,要求输出从开始运行起的每一步骤的结果。用C或C++或Java或Python语言实现程序解决问题。
要求:1. 程序风格良好(使用自定义注释模板);
2. 提供友好的输入输出,并进行输入数据的正确性验证。
源代码:
import java.util.*; /** * @description: 该类模拟XN*2图灵机,对任意给定的十进制数,转换为收缩扩展二进制的编码,并可输出运行中每一步骤的结果 */public class TuringMachine { private int internalState; // 图灵机的内态 private String binCode; // 二进制编码 Function f = new Function(); // 需要用到的方法 ListbinCodeList = 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; } /** * @description: 模拟图灵机的运行过程 * @param: [binCode 二进制编码] * @return: void */ 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 } /** * @description: 根据指令对每一步骤结果进行打印 * 指令1: 0 0 -> 0 0 R * 0 1 -> 1 0 R * 指令2: 1 0 -> 0 1 R * 1 1 -> 10 0 R * 指令3: 10 0 -> 11 1 R * 指令4: 11 0 -> 0 1 STOP * @param: [input 输入, i 循环的次数从0开始, binCodeList 存放二进制编码binCode] * @return: void */ private void instruction_1(String input, int i, List 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 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 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 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("输入有误!"); } } } /** * @description: 该类具有图灵机TuringMachine运行过程中所需要的一些方法 */class Function { /** * @description: 将十进制数转换为二进制编码 * @param: [decNum 十进制数] * @return: java.lang.String */ 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; } /** * @description: 将二进制编码转换为十进制数 * @param: [binCode 二进制编码] * @return: int */ 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; } /** * @description: 将二进制编码binCode存放到binCodeList中 * @param: [binCode 二进制编码] * @return: java.util.List */ public List toArrayList(String binCode) { binCode = binCode.replaceAll("", " ").trim(); // 将binCode中的每个字符用空格分隔开,并去掉首尾的空格 // 根据分隔符空格分隔出binCode中的每个字符存放到binCodeList中 List binCodeList = new ArrayList<>(Arrays.asList(binCode.split(" "))); return binCodeList; } /** * @description: 将binCodeList转换为二进制编码binCode * @param: [binCodeList 存放binCode的容器] * @return: java.lang.String */ public String toString(List binCodeList) { String binCode = String.join("", binCodeList); return binCode; } }
读到这里,这篇"如何使用Java模拟XN*2图灵机"文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注行业资讯频道。
二进制
编码
输入
十进制
指令
十进
图灵
图灵机
步骤
结果
运行
字符
循环
文章
空格
过程
输出
内容
方法
时机
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
可以发包的服务器
软件开发前端后端哪个好
软件开发市场经济周期
怎样启用金蝶数据库
西奥电梯tt服务器接线图
ibm服务器有两根线吗
数据库范式表达
bs管理软件开发实例
网络技术证书等级有没有二级
iOS三国志战略版服务器进不去
ilm数据库
英雄网络安全ppt
键值数据库有数据和什么组成
沃尔玛网络安全维护的投资额
在紫金保险软件开发岗怎么样
前置数据库对接
僵毁服务器怎么加mod
数据库atlas
天津特色软件开发市场报价
去北京做软件开发
csgo显示服务器负载过高
sql2005数据库导入
齐荣网络技术有限公司
服务器怎么开任务管理员
优易企网络技术有限公司
网络安全学python还是java
软件开发协作平台系统
数据库查询sql实验
武汉国家网络安全规划
深圳盈泰网络安全