java实现图灵机xn*2

问题描述

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

步骤:

1.算法分析

根据如下指令给出图灵机(XN×2)在扩展的二进位上实现这个运算的指令:
00→00R,
01→10R,
10→01R,
11→100R,
100→111R,
110→01STOP。
编码转换规则:
0→0;1→10;, →110;
分析:通过图灵机(XN×2) 在扩展二进位上的运算指令实现将二进制数乘2的运算。首先将所得到的十进制数转换成二进制数再转化为扩展二进制数,运算后得到结果再转化为十进制验证。

2.概设计

在这里插入图片描述

3.测试

测试0
在这里插入图片描述
测试正整数
在这里插入图片描述
测试负数
在这里插入图片描述

4.心得体会

在理解了图灵机的工作原理之后,通过分不同情况下分步计算即可得出相应的结果。
在程序设计中出现了进制转换相关的知识,还是需要查询相应的资料才能完好的实现功能。通过这些算法设计,对图灵机的工作原理有了一定的熟悉,这对以后的学习方面有着一定的帮助。

源代码

calculate类

package calculate;
public class calculate {
    public String change1(int input) { //转换为二进制
        String c1 = "0" + Integer.toinputString(input) + ",";
        System.out.println("转换为二进制数:" + c1);
        return c1;
    }
    public String change2(String s) { //转换为扩展二进制
        String c2 = s.replace("1", "10").replace(",", "110");
        System.out.println("转换为扩展二进制数:" + c2);
        return c2;
    }
    public String calculate(String input) {
        StringBuilder num = new StringBuilder(input);
        int j = 0;
        for (int i = 0; i < num.length(); i++) {
            if (j== 0 && num.charAt(i) == '0') {
                System.out.println("第" + (i + 1) + "次运算结果为:" + num);
                continue;
            }  //00→00R,
            if (j == 0 && num.charAt(i) == '1') {
                j = 1;
                num.setCharAt(i, '0');
                System.out.println("第" + (i + 1) + "次运算结果为:" + num);
                continue;
            }  //01→10R,
            if (j == 1 && num.charAt(i) == '0') {
                j = 0;
                num.setCharAt(i, '1');
                System.out.println("第" + (i + 1) + "次运算结果为:" + num);
                continue;
            }  //10→01R,
            if (j == 1 && num.charAt(i) == '1') {
                j = 10;
                num.setCharAt(i, '0');
                System.out.println("第" + (i + 1) + "次运算结果为:" + num);
                continue;
            }  //11→100R,
            if (j == 10 && num.charAt(i) == '0') {
                j = 11;
                num.setCharAt(i, '1');
                System.out.println("第" + (i + 1) + "次运算结果为:" + num);
                continue;
            }  //100→111R,
            if (j == 11 && num.charAt(i) == '0') {
                j = 0;
                num.setCharAt(i, '1');
                System.out.println("第" + (i + 1) + "次运算结果为:" + num);
            }  //110→01STOP。
        }
        return num.toString();
    }
    public String change3(String input) {
        int a = input.indexOf("1");
        String c3 = input.substring(a, input.length() - 1).replace("10", "1") + ",";
        System.out.println("转换为二进制数:" + c3);
        return c3;
    }

    public int change4(String input) {
        int c4 = Integer.parseInt(input.substring(0, input.length() - 1), 2);
        System.out.println("转换为十进制数:" + c4);
        return c4;
    }
    public int cal(int input) {
        if (input < 0) {
            System.out.println("不支持负数运算。");
            return input;
        }
        if (input == 0) {
            System.out.println("0*2=0");
            return 0;
        }
        String a = change1(input); //二进制数
        String b = change2(a);  //扩展二进制数
        String num = calculate(b); //计算
        a = change3(num); //结果二进制数
        input = change4(a); //结果十进制数
        return input;
    }
}

测试类

package calculate;
import java.util.Scanner;
public class test {
	public static void main(String[] args) {
		  	Scanner in = new Scanner(System.in);
	        System.out.print("输入一个十进制整数:");
	        int input = in.nextInt();
	        calculate c = new calculate();
	        c.cal(input);
	}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值