对于XN+1或XN*2图灵机进行模拟,任意给定的十进制数a,转换为收缩扩展二进制的编码,再编程模拟此Turing机的运行过程,要求输出从开始运行起的每一步骤的结果。 用C或C++或java或python语言实现程序解决问题。
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课程刚好学到了字符串,并且可以完成运用到此次实验中,于是用它自带的方法就可以很容易将十进制转化为二进制再转化为图灵机二进制,主要问题是再把自己的思想转化为代码时转换有点失误。其接下来都比较顺利。
对于这次的不足就是,我没能合理的运用到一些更好的方法,并且程序可能会不太完善,希望我可以掌握更多的编程技巧,还有这次我发现,在修改代码时应该让别人来帮你来进行修改,这样对于学习来说比较快,而且很容易发现问题所在。
什么是内容溢出呢?其实就是当文字很多的时候,如果内容区域只有那么长,那么多...
PHP正则表达式替换实现 是如何的呢?首先向你介绍下 PHP preg_replace,PHP preg...
在学校的时候每个月都理所应到的从爸妈那里得到一笔不算多也不算少的生活费。这...
在Asp.Net框架中提供了几种身份验证方式:Windows身份验证、Forms身份验证、pass...
这几天做一个跨机房实时迁移的操作,碰到一个有些奇怪的问题,记录一下。 整体服...
要想学会正则表达式,理解元字符和普通字符是一个必须攻克的难关。不用刻意记。...
搜索是一个非常常见的功能,大家肯定都使用过,例如:百度搜索、Google 搜索、电...
一、问题描述 ajax 异步请求成功后需要新开窗口打开 url,使用的是 window.open(...
8条Asp编码优化技巧: 1、声明VBScript变量 在ASP中,对vbscript提供了强劲的支...
搞了半天原来点击提交按钮 少加了个 type="button" 原来是 form button id="sub"...