图灵机XN*2进行模拟
基本要求: 对于XN*2图灵机进行模拟,任意给定的十进制数a,转换为收缩扩展二进制的编码,再编程模拟此Turing机的运行过程,要求输出从开始运行起的每一步骤的结果。
- 算法分析
(1)二进制编码转换。
接收一个十进制数的输入,转换为二进制数,按照0->0、1->01的规则进行数据替换,最后在末尾添加一个‘110’。
(2)图灵机XN*2指令计算:
0 0 ->0 0 R,
0 1 ->1 0 R,
1 0 ->0 1 R,
1 1 ->10 0 R,
10 0 ->11 1 R,
11 0 ->0 1 STOP。
根据指令来设置if else语句,来进行内态与输入的计较并且改变内态和输出。
(3)输出最终结果:
将指令计算结果首先删去末尾的‘110’, 按照0->0、01->1的规则转化为二进制数,再由二进制数转换为十进制数进行返回输出。 - 概要设计
输入需要计算的十进制数,将输入的数通过Binary()方法中Integer.toBinaryString(),转化为二进制数,然后用StringBuffer类replace将二进制数转化为二进制编码形式,将二进制编码通过Calcurlate()方法循环计算指令计算(用charAt()方法返回指定索引i处字符,setCharAt()设置当前索引处字符内容),break退出循环。最后将指令计算的结果通过Reduction()方法转换成十进制,输出结果。
下面是主程序
package 图灵机;
import java.util.Scanner;
public class Turing {
//将整型十进制正数编码为所需要的二进制编码
static StringBuffer Binary(int n){
String str;
//十进制转换为二进制表示的字符串
str = Integer.toBinaryString(n);
System.out.println("转换为二进制为:"+str);
//转化成扩展二进制编码
StringBuffer code = new StringBuffer(str.replace("1","10"));
code.append("110"); //在扩展二进制编码后添加“110”表示“,”
System.out.println("编码后为:" +code);
return code;
}
//将编码进行乘2计算
static void calculate(StringBuffer sb){
int flag = 0; //设置内态变量
//通过扩展二进制编码字符长度进行循环计算
for(int i=0; i<sb.length(); i++){
if(flag==0 & sb.charAt(i)=='0') //0 0->0 0R
{
//flag = 0;
sb.setCharAt(i,'0');
continue;
}
if( flag==0 & sb.charAt(i)=='1') //0 1->1 0R
{
flag = 1;
sb.setCharAt(i,'0');
continue;
}
if( flag==1 & sb.charAt(i)=='0') //1 0->0 1R
{
flag = 0;
sb.setCharAt(i,'1');
continue;
}
if( flag==1 & sb.charAt(i)=='1') //1 1->10 0R
{
flag = 10;
sb.setCharAt(i,'0');
continue;
}
if( flag==10 & sb.charAt(i)=='0') //10 0R->11 1
{
flag = 11;
sb.setCharAt(i,'1');
continue;
}
if( flag==11 & sb.charAt(i)=='0') //11 0->0 1STOP
{
sb.setCharAt(i,'1');
break;
}
}
System.out.println("计算结果为:" + sb);
}
//将二进制编码还原为整型十进制正数
static void Reduction(StringBuffer m)
{
m.delete(m.length()-1, m.length()); //将末尾的逗号去掉
String s = m.toString().replace("10", "1"); //把扩展二进制编码的10替换成为1
System.out.println("计算结果转换为二进制为:" + s );
//Integer.parseInt方法,将结果转换为十进制
int a=Integer.parseInt(s, 2);
System.out.println("计算结果转换为十进制为:"+a);
}
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
System.out.print("请输入要计算的数字:");
if(sc.hasNextInt())
{
int num = sc.nextInt();
StringBuffer sb = Binary(num);
calculate(sb);
Reduction(sb);
}
else
{ System.out.println("输入不合理,请重新输入"); }
}
}
测试类
package 图灵机;
import java.util.Random;
public class Test extends Turing {
static void test() {
Random r = new Random();
for (int i = 0; i < 5; i++)//随机生成5个数字
{
int t = r.nextInt(1000);//随机生成范围[0,1000)
System.out.println("输入的数为: " + t);
StringBuffer sb = Binary(t);
calculate(sb);
Reduction(sb);
}
}
}
测试结果
3.心得体会
对于“XN*2图灵机”问题,首先要理解图灵机的算法过程,一开始还有点迷迷糊糊的,后来再老师的一步步指导下,掌握了它的基本算法。然后在这次作业的主要用到了StringBuffer()类的一些方法,由于正巧Java课更好学到了这些知识,使得这次作业没有太大太困难的问题。但我也是第一次真正使用这些,需要考虑到的问题很多,不断的调试最后得到正确的结果。通过这次作业,我收获到了很多有用的知识,与此同时也发现自己的很多不足之处,基础知识掌握不牢固,不能学以致用。