本文小编为大家详细介绍“如何使用Java模拟XN*2图灵机”,内容详细,步骤清晰,细节处理妥当,希望这篇“如何使用Java模拟XN*2图灵机”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

题目描述:

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

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

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

源代码:

importjava.util.*;/***@description:该类模拟XN*2图灵机,对任意给定的十进制数,转换为收缩扩展二进制的编码,并可输出运行中每一步骤的结果*/publicclassTuringMachine{privateintinternalState;//图灵机的内态privateStringbinCode;//二进制编码Functionf=newFunction();//需要用到的方法List<String>binCodeList=newArrayList<>();//用来存放二进制编码staticintr=0;//当r为1时机器向右移动一格staticints=0;//当s为1时机器停止运行TuringMachine(){internalState=0;binCode="0";}publicintgetInternalState(){returninternalState;}publicvoidsetInternalState(intinternalState){this.internalState=internalState;}publicStringgetBinCode(){returnbinCode;}publicvoidsetBinCode(StringbinCode){this.binCode=binCode;}/***@description:模拟图灵机的运行过程*@param:[binCode二进制编码]*@return:void*/publicvoidrunProcess(StringbinCode){binCodeList=f.toArrayList(binCode);//将二进制码binCode转换为ArrayList类型存放在binCodeList中//for循环对binCodeList进行遍历,根据当前内态的值判断该执行哪条指令for(inti=0;i<binCodeList.size();i++){r=1;//当s==1时机器停止,跳出循环if(s==1){break;}switch(getInternalState()){//内态为0时执行指令1case0:instruction_1(binCodeList.get(i),i,binCodeList);break;//内态为1时执行指令2case1:instruction_2(binCodeList.get(i),i,binCodeList);break;//内态为10时执行指令3case10:instruction_3(binCodeList.get(i),i,binCodeList);break;//内态为11时执行指令4case11: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:00->00R*01->10R*指令2:10->01R*11->100R*指令3:100->111R*指令4:110->01STOP*@param:[input输入,i循环的次数从0开始,binCodeList存放二进制编码binCode]*@return:void*/privatevoidinstruction_1(Stringinput,inti,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();}privatevoidinstruction_2(Stringinput,inti,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();}privatevoidinstruction_3(Stringinput,inti,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();}privatevoidinstruction_4(Stringinput,inti,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();}publicstaticvoidmain(String[]args){TuringMachinetm=newTuringMachine();//创建TuringMachine的实例tmSystem.out.println("请输入一个十进制数:");Scannerscanner=newScanner(System.in);try{intdecNum=scanner.nextInt();tm.setBinCode(tm.f.toBinCode(decNum));//将十进制数转换为二进制编码并赋值给binCodeSystem.out.println();tm.runProcess(tm.getBinCode());//运行图灵机}catch(InputMismatchExceptionex){System.out.println("输入有误!");}}}/***@description:该类具有图灵机TuringMachine运行过程中所需要的一些方法*/classFunction{/***@description:将十进制数转换为二进制编码*@param:[decNum十进制数]*@return:java.lang.String*/publicStringtoBinCode(intdecNum){StringbinCode="";StringbinNum=Integer.toBinaryString(decNum);//十进制数转换为二进制数binNum+=",";//用,标识此二进制数到此已完整,后面的0都忽略不计System.out.println("这个数的二进制表示为:"+binNum);//利用for循环对二进制数binNum中的字符进行遍历,根据其中的每个字符得出二进制编码binCodefor(inti=0;i<binNum.length();i++){//0->0if(binNum.charAt(i)=='0'){binCode+="0";//1->10}elseif(binNum.charAt(i)=='1'){binCode+="10";//,->110}elseif(binNum.charAt(i)==','){binCode+="110";}}binCode="0"+binCode+"00";System.out.println("这个数的二进制编码为:"+binCode);returnbinCode;}/***@description:将二进制编码转换为十进制数*@param:[binCode二进制编码]*@return:int*/publicinttoDecNum(StringbinCode){intdecNum=0;StringbinNum="";//先利用for循环对ArrayList类型的binCode进行遍历,根据其中的每个元素得出二进制编码binCodefor(inti=0;i<binCode.length();i++){//0->0if(binCode.charAt(i)=='0'){binNum+="0";}elseif(binCode.charAt(i)=='1'){//10->1if(binCode.charAt(i+1)=='0'){binNum+="1";i++;//110->,}elseif(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);returndecNum;}/***@description:将二进制编码binCode存放到binCodeList中*@param:[binCode二进制编码]*@return:java.util.List<java.lang.String>*/publicList<String>toArrayList(StringbinCode){binCode=binCode.replaceAll("","").trim();//将binCode中的每个字符用空格分隔开,并去掉首尾的空格//根据分隔符空格分隔出binCode中的每个字符存放到binCodeList中List<String>binCodeList=newArrayList<>(Arrays.asList(binCode.split("")));returnbinCodeList;}/***@description:将binCodeList转换为二进制编码binCode*@param:[binCodeList存放binCode的容器]*@return:java.lang.String*/publicStringtoString(List<String>binCodeList){StringbinCode=String.join("",binCodeList);returnbinCode;}}

读到这里,这篇“如何使用Java模拟XN*2图灵机”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注亿速云行业资讯频道。