图灵机模拟运算XN*2

##图灵机模拟运算XN2(java实现)
题目:对于XN
2图灵机进行模拟,任意给定的十进制数a,转换为收缩扩展二进制的编码,再编程模拟此Turing机的运行过程,要求输出从开始运行起的每一步骤的结果。

输入格式:
输入一个正整数

输入样例:

16
167

输出样例:

16
内态:0输入:1
第1步结果为:0000001100
内态变为:1输入变为:0
第2步结果为:0100001100
内态变为:0输入变为:1
第3步结果为:0100001100
内态变为:0输入变为:0
第4步结果为:0100001100
内态变为:0输入变为:0
第5步结果为:0100001100
内态变为:0输入变为:0
第6步结果为:0100001100
内态变为:0输入变为:0
第7步结果为:0100000100
内态变为:1输入变为:0
第8步结果为:0100000000
内态变为:10输入变为:0
第9步结果为:0100000010
内态变为:11输入变为:1
第10步结果为:0100000011
内态变为:0输入变为:1
结果的二进制编码:100000
最终答案:32

167
内态:0输入:1
第1步结果为:00010001010101100
内态变为:1输入变为:0
第2步结果为:01010001010101100
内态变为:0输入变为:1
第3步结果为:01010001010101100
内态变为:0输入变为:0
第4步结果为:01000001010101100
内态变为:1输入变为:0
第5步结果为:01001001010101100
内态变为:0输入变为:1
第6步结果为:01001001010101100
内态变为:0输入变为:0
第7步结果为:01001001010101100
内态变为:0输入变为:0
第8步结果为:01001000010101100
内态变为:1输入变为:0
第9步结果为:01001000110101100
内态变为:0输入变为:1
第10步结果为:01001000100101100
内态变为:1输入变为:0
第11步结果为:01001000101101100
内态变为:0输入变为:1
第12步结果为:01001000101001100
内态变为:1输入变为:0
第13步结果为:01001000101011100
内态变为:0输入变为:1
第14步结果为:01001000101010100
内态变为:1输入变为:0
第15步结果为:01001000101010000
内态变为:10输入变为:0
第16步结果为:01001000101010010
内态变为:11输入变为:1
第17步结果为:01001000101010011
内态变为:0输入变为:1
结果的二进制编码:101001110
最终答案:334

代码

public class sss {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        //输入一个整数
        int i = sc.nextInt();
        while(i < 0){
            System.out.println("请重新输入一个大于0的整数");
            i = sc.nextInt();
        }
        //将其转换为二进制字符串常量str1
        String str1 = Integer.toBinaryString(i);
        //定义一个StringBuffer类的空的可变字符串str
        StringBuffer str2 = new StringBuffer();
        //遍历str1 判断01,向str2中添加‘10'或者'0',生成伸缩扩展二进制编码str2
        for(int x = 0 ;x <str1.length();x++){
            if(str1.charAt(x) == '1')
                str2.append("10");
            if(str1.charAt(x) == '0')
                str2.append("0");
        }
        //向str2后面添加'1100',作为计算后续的结束标志
        str2.append("1100");

        //初始化内态n等于0
        String n = "0";
        System.out.println("内态:"+n+"输入:"+str2.charAt(0));
        //进行XN*2的操作
        for(int x = 0 ; x < str2.length();x++){
            if(n == "0" && str2.charAt(x) == '0'){
                n = "0";
                str2.setCharAt(x,'0');
            }
            else if(n == "0" && str2.charAt(x) == '1'){
                n = "1";
                str2.setCharAt(x,'0');
            }else if(n == "1" && str2.charAt(x) == '0'){
                n = "0";
                str2.setCharAt(x,'1');
            }else if(n == "1" && str2.charAt(x) == '1'){
                n = "10";
                str2.setCharAt(x,'0');
            }else if(n == "10" && str2.charAt(x) == '0'){
                n = "11";
                str2.setCharAt(x,'1');
            }else if(n == "11" && str2.charAt(x) == '0'){
                n = "0";
                str2.setCharAt(x,'1');
            }
            System.out.println("第"+(x+1)+"步结果为:"+str2);
            System.out.println("内态变为:"+n+"输入变为:"+str2.charAt(x));
        }
        //定义一个ans 存储最终结果
        StringBuffer ans = new StringBuffer("");
        int a = 0,b = 1;
        //伸缩扩展二进制码转换为二进制码
        while(true)
        {
            if(str2.charAt(a) == '1'&& str2.charAt(b)=='0')
                ans.append('1');
            else if(str2.charAt(a) == '0'&& str2.charAt(b)=='0')
                ans.append('0');
            else if(str2.charAt(a) == '1'&& str2.charAt(b)=='1')
                break;
            a++;
            b++;
        }
        System.out.println("结果的二进制编码:"+ans);
        System.out.println("最终答案:"+Integer.parseInt(ans.toString(),2));
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值