用Java语言完成图灵机的XN*2的算法过程

用Java语言完成图灵机的XN*2的算法过程



问题描述

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


一、问题分析

我们要通过Java语言将XN*2的算法进行输入,达到图灵机运转的效果,利用 String 类中的Integer.toBinaryString()将十进制数改成二进制数,再利用append函数把字符串“1100”加在该数的二进制后方,以方便我们进行图灵机运算。将转好的字符串利用charAt进行获取在setCharAt进行修改,在这个过程中我们采用for循环语句。在进行图灵机算法中我们利用判断类型的函数进行图灵机的算法输入。可以用if()或者switch······case函数。完后图灵机算法后,将该数还原为XN*2的结果并进行输出。

二、流程图

算法流程图

三、使用步骤

1.建造转化为二进制和在末尾加上“1100”的类

class Tran {
     public StringBuffer Trans(int a){
         String s=Integer.toBinaryString(a);//将输入的数转化为二进制
         StringBuffer str=new StringBuffer(s.replace("1","10"));//将二进制中的‘1’转化为‘10’
         str.append("1100");//在其后加上字符串”1100“
         System.out.println("这个数的二进制数位:"+str);//友好输出
         return str;
     }
}

2.建造图灵机算法的主要内容(这里采用for和switch···case···进行循环和判断)

public class Tuling {
    public void tuling(StringBuffer a) {
        for (int i = 0, NT = 0; i < a.length(); i++) {//用for循环对数开始进行图灵机演示
            switch (NT) {//利用switch~case进行判断
                case (0): {
                    switch (a.charAt(i)){
                        case ('0'):{
                            NT = 0;
                            a.setCharAt(i, '0');
                            System.out.println("内态:0,输入:0,变为:" + a + " 内态:" + NT + " 输出:" + a.charAt(i));
                            break;}
                        case ('1'):{
                            NT = 1;
                            a.setCharAt(i, '0');
                            System.out.println("内态:0,输入:1,变为:" + a + " 内态:" + NT + " 输出:" + a.charAt(i));
                            break;
                        }
                    }
                        break;}
                case (1): {
                    switch (a.charAt(i)) {
                        case ('0'): {
                            NT = 0;
                            a.setCharAt(i, '1');
                            System.out.println("内态:1,输入: 0,变为:" + a + " 内态:" + NT + " 输出:" + a.charAt(i));
                            break;
                        }
                        case ('1'): {
                            NT = 10;
                            a.setCharAt(i, '0');
                            System.out.println("内态:1,输入:1,变为:" + a + " 内态:" + NT + " 输出:" + a.charAt(i));
                            break;
                        }
                    }
                        break;}
                case (10):{
                    NT = 11;
                    a.setCharAt(i, '1');
                    System.out.println("内态:10,输入:0,变为: " + a + " 内态:" + NT + " 输出:" + a.charAt(i));
                    break;
                }
                case (11): {
                    NT = 0;
                    a.setCharAt(i, '1');
                    System.out.println("内态:11,输入:0,变为:" + a + " 内态:" + NT + " 输出:" + a.charAt(i));
                    break;
                }
            }
        }
    }
}

该处的NT表示的是内态。

3.还原为XN*2的十进制数

        stringBuffer.delete(stringBuffer.length()-2, stringBuffer.length());
        System.out.println("计算结果:"+Integer.parseInt(stringBuffer.toString().replace("10", "1"), 2));

该处的stringBuffer是定义的输出的字符串名称。


四、备注

这里将主函数的代码提供在这,以供大家参考!

import java.util.Scanner;

public class Main {
    public static void main(String args[]) {
        Tran tran=new Tran();    //对类Tran进行定义
        Scanner scanner = new Scanner(System.in);//输入一个数,对该数进行XN*2图灵机算法
        System.out.println("请输入一个数:");
        int number = scanner.nextInt();
        StringBuffer stringBuffer=tran.Trans(number);//将输入的值number进入Tran中的StringBuffer,运行Trans函数
        Tuling tu=new Tuling();//对类Tuling进行定义
        tu.tuling(stringBuffer);
        System.out.println("计算后二进位码为:"+stringBuffer);//输出二进位码的值
        stringBuffer.delete(stringBuffer.length()-2, stringBuffer.length());
        System.out.println("计算结果:"+Integer.parseInt(stringBuffer.toString().replace("10", "1"), 2));
    }
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值