用Java语言模拟图灵机XN*2过程

问题描述:

对于XN*2图灵机进行模拟,任意给定的十进制数a,转换为收缩扩展二进制的编码,再编程模拟此Turing机的运行过程,要求输出从开始运行起的每一步骤的结果。 用java语言实现程序解决问题。
1.程序风格良好
2.提供友好的输入输出,并进行输入数据的正确性验证。

算法分析:

图灵机(XN*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’替换为’10’,’0’不变,’,’替换为’110’)
③:在扩展码上从左至右依次进行上述指令,第一个数值为内态,第二个为输入值,箭头后第一个数值为操作后的内态,第二个为输出值
④:将过程结果转换为二进制结果,再将二进制结果转换为十进制
⑤:最后输出十进制结果


流程图:

在这里插入图片描述

测试:

测试用例:17
输出结果应为:34
截图如下:
在这里插入图片描述


调试:

①:十进制数转换为二进制:
在这里插入图片描述
②:将二进制数转换为扩展码:
在这里插入图片描述
③:模拟图灵机XN*2运算:
在这里插入图片描述
④:将运算结果转换为二进制数:
在这里插入图片描述
⑤:将二进制数转换为十进制数:
在这里插入图片描述


源代码:

package tulingji;

import java.util.Scanner;

public class tulingji {
    public static void main(String[] args) {
        System.out.print("请输入一个十进制数:");
        Scanner n = new Scanner(System.in);
        //定义变量接收输入的十进制数
        int ten = n.nextInt();
        //调用进制转换函数将十进制转换为二进制
        String two = Integer.toBinaryString(ten);
        System.out.println("转换为的二进制数为:"+two);
        //将字符串中所有的'1'转换为'10'
        String str = two.replace("1","10");
        StringBuffer str1 = new StringBuffer(str);
        //模拟将最后的','转换为'110'
        str1.append("11000");
        System.out.println("替换后的二进制扩展码为:"+ str1);
        //定义变量表示内态
        int Flag=0;
        //根据内态和输入不同选择不同的执行语句
        for(int i=0;i<str1.length();i++){
            if(Flag==0&&str1.charAt(i)=='0'){
                Flag=0;
                str1.setCharAt(i,'0');
                System.out.println("内态为0,输入为0,经由指令后内态变为0,输出为0");
                continue;
            }
            if(Flag==0&&str1.charAt(i)=='1'){
                Flag=1;
                str1.setCharAt(i,'0');
                System.out.println("内态为0,输入为1,经由指令后内态变为1,输出为0");
                continue;
            }
            if(Flag==1&&str1.charAt(i)=='0'){
                Flag=0;
                str1.setCharAt(i,'1');
                System.out.println("内态为1,输入为0,经由指令后内态变为0,输出为1");
                continue;
            }
            if(Flag==1&&str1.charAt(i)=='1'){
                Flag=10;
                str1.setCharAt(i,'0');
                System.out.println("内态为1,输入为1,经由指令后内态变为10,输出为0");
                continue;
            }
            if(Flag==10&&str1.charAt(i)=='0'){
                Flag=11;
                str1.setCharAt(i,'1');
                System.out.println("内态为10,输入为0,经由指令后内态变为11,输出为1");
                continue;
            }
            if(Flag==11&&str1.charAt(i)=='0'){
                Flag=0;
                str1.setCharAt(i,'1');
                System.out.println("内态为11,输入为0,经由指令后内态变为0,输出为1");
                break;
            }
        }
        System.out.println("执行指令后的结果为:"+str1);
        //模拟删除','的过程
        str1.delete(str1.length()-3,str1.length());
        String str2 = str1.toString().replace("10", "1");
        System.out.println("转换为的二进制数为:"+ str2);
        //将二进制数转换为十进制数并输出结果
        int ten1=Integer.parseInt(str2,2);
        System.out.println("最后的十进制结果为:"+ten1);
    }
}

心得体会:

①:学习了数值转换函数的应用
②:学习了String类和StringBuffer 类的区别


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

希望小党永远开心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值