Java实现模拟图灵机x*2的运行过程
对于XN+1或XN*2图灵机进行模拟,任意给定的十进制数a,转换为收缩扩展二进制的编码,再编程模拟此Turing机的运行过程,要求输出从开始运行起的每一步骤的结果。 用C或C++或java或python语言实现程序解决问题。
编程新手跳转学习Hello World!
编程新手跳转学习作业三天打鱼两天晒网
0 0→0 0R
0 1→1 0R
1 0→0 1R
1 1→10 0R
10 0→11 1R
11 0→0 1STOP
这是图灵机XN*2的指令集
这是字符串的常用方法:
length() 查看字符串的长度
charAt() 定位某个字符,返回它的位置
lastIndexOf() 某个字符最后一次出现的位置
substring() 截取子串,如果参数有两个左闭右开[1,5)
equals() 判断两个串是否相等,注意String重写了Object的此方法,所以内容相同就返回true
startsWith() 判断是不是以参数开头
endsWith() 判断是不是以参数结尾
split() 以指定字符分割
trim() 去掉首尾两端的空格
getBytes() 把串转换成数组
toUpperCase() 变成全大写
toLowerCase() 变成全小写
String.valueOf(10) 把int类型的10转换成String类型
String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且浪费大量优先的内存空间
**StringBuffer是可变类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象。每个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量 **
StringBuilder可变类,速度更快
这下面是代码
代码:
主要模拟过程
package 图灵机;
import java.util.Scanner;
public class 图灵机 {
public static void main(String[] args) {
Scanner a =new Scanner(System.in);
System.out.println("输入一个数字:");
int b=a.nextInt();
if(b<=0){
System.out.println("不行,重新输入");
return;
}
String c= zhuan(b);
String d= zhuan1(c);
String f= tuling(d);
}
十进制转换为二进制
private static String zhuan(int n) {
String result = "0"+Integer.toBinaryString(n)+",";
System.out.println("转换为二进制在前面加上0后面加上一个,结果为为:"+result);
return result;
}
二进制转换为图灵机二进制
private static String zhuan1(String m) {
String result1 = m.replace("1","10").replace(",","110");
System.out.println("转换为二进制拓展为:"+result1);
return result1;
}
对于图灵机最主要的过程
public static String tuling(String e) {
StringBuffer c = new StringBuffer(e);
int nei = 0; //内态,默认为零
for (int i = 0; i < c.length(); i++) {
// 0 0 --> 0 0 R
if (nei == 0 && c.charAt(i) == '0') {
System.out.println("第" + (i + 1) + "次运算, 此时内态0 输入0, 运算后内态0 输出0, 此时值:" + c);continue;
}
// 0 1 --> 1 0 R
if (nei == 0 && c.charAt(i) == '1') {
nei = 1;
c.setCharAt(i, '0');
System.out.println("第" + (i + 1) + "次运算, 此时内态0 输入1, 运算后内态1 输出0, 此时值:" + c);continue;
}
// 1 0 --> 0 1 R
if (nei == 1 && c.charAt(i) == '0') {
nei= 0;
c.setCharAt(i, '1');
System.out.println("第" + (i + 1) + "次运算, 此时内态1 输入0, 运算后内态0 输出1, 此时值:" + c);continue;
}
// 1 1 --> 10 0 R
if (nei == 1 && c.charAt(i) == '1') {
nei = 10;
c.setCharAt(i, '0');
System.out.println("第" + (i + 1) + "次运算, 此时内态1 输入1, 运算后内态10 输出0, 此时值:" + c);continue;
}
// 10 0 --> 11 1 R
if (nei == 10 && c.charAt(i) == '0') {
nei = 11;
c.setCharAt(i, '1');
System.out.println("第" + (i + 1) + "次运算, 此时内态10 输入0, 运算后内态11 输出1, 此时值:" + c);continue;
}
// 11 0 --> 0 1 STOP
if (nei == 11 && c.charAt(i) == '0') {
nei = 0;
c.setCharAt(i, '1');
System.out.println("第" + (i + 1) + "次运算, 此时内态11 输入0, 运算后内态0 输出1, 此时值:" + c);
}
}
return c.toString();
}
}
调试与运行结果:
心得:
首先对于这次作业,我觉得我的思路一开始不太清晰,不知道用什么方法完成,但java课程刚好学到了字符串,并且可以完成运用到此次实验中,于是用它自带的方法就可以很容易将十进制转化为二进制再转化为图灵机二进制,主要问题是再把自己的思想转化为代码时转换有点失误。其接下来都比较顺利。
对于这次的不足就是,我没能合理的运用到一些更好的方法,并且程序可能会不太完善,希望我可以掌握更多的编程技巧,还有这次我发现,在修改代码时应该让别人来帮你来进行修改,这样对于学习来说比较快,而且很容易发现问题所在。