用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));
}
}