图灵机
对于XN+1或XN2图灵机进行模拟,任意给定的十进制数a,转换为收缩扩展二进制的编码,再编程模拟此Turing机的运行过程,要求输出从开始运行起的每一步骤的结果。 用C或C++或java或python语言实现程序解决问题。
1.程序风格良好(使用自定义注释模板)
2.提供友好的输入输出,并进行输入数据的正确性验证。
算法分析
在进行图灵机的模拟时,首先要进行二进制的转换,这里我们调用了一个Java语言的内部方法“Integer.toBinaryString”,然后又用“toCharArray”将字符串类型改为字符数组型,便于调用。使用条件语句进行判断,将二进制转换为扩展二进制,再对扩展二进制进行XN2运算。然后将得到的结果转回二进制,通过“Integer.parseInt”将二进制数转为十进制结果。
概要设计
//Transform.java
import java.util.*;
/**
*
* @author lenovo青山不改旧
* Apr 13, 2021
* @Classname:Transform
* @Description:TODO:定义一个转换类,对输入的数值进行转化。
*
*/
public class Transform {
String binary_1 ="";//转换后的二进制
String extend_1="";//伸缩扩展二进制
/**
* 构造函数,用来输入计算的数字并转换为二进制成员变量
*/
public Transform() {
System.out.println("请输入一个十进制整数:");
Scanner sca=new Scanner(System.in);
int decimalism=sca.nextInt();
binary_1 = Integer.toBinaryString(decimalism);//将十进制转换为二进制
System.out.println("转换为二进制为:"+binary_1);
binary_1+=',';
}
/**
*
* @Title:convert
* @Description:TODO
* @param binary_2字符串数组容器
* @return void
* @throws
*/
public void convert() {
char[] binary_2=binary_1.toCharArray();
//将二进制转为伸缩扩展二进制
for(int i=0;i<binary_2.length;i++) {
if(binary_2[i]=='0') {
extend_1+='0';
}
else if(binary_2[i]=='1') {
extend_1+="10";
}
else if(binary_2[i]==',') {
extend_1+="110";
}
}
extend_1='0'+extend_1+'0';
System.out.println("转换为扩展二进制为:"+extend_1);
}
}
//Counting.java
/**
* @author lenovo青山不改旧
* Apr 13, 2021
* @Classname:Counting
* @Description:TODO:显示XN*2的过程并算出最后结果。
*
*/
public class Counting extends Transform{
String extend_3="";//XN*2的伸缩扩展二进制
String binary_3="";//XN*2后的二进制
/**
*
* @Title:process
* @Description:TODO
* @param state内态
* @param extend_2存放转换前的伸缩扩展二进制编码
* @return void
* @throws
*/
public void process() {
String state="0";
char[] extend_2=extend_1.toCharArray();
//进行XN*2
for(int i=0;i<extend_2.length;) {
if(state=="0"&&extend_2[i]=='0') {
state="0";
extend_2[i]='0';
i++;
}
else if(state=="0"&&extend_2[i]=='1') {
state="1";
extend_2[i]='0';
i++;
}
else if(state=="1"&&extend_2[i]=='0') {
state="0";
extend_2[i]='1';
i++;
}
else if(state=="1"&&extend_2[i]=='1') {
state="10";
extend_2[i]='0';
i++;
}
else if(state=="10"&&extend_2[i]=='0') {
state="11";
extend_2[i]='1';
i++;
}
else if(state=="11"&&extend_2[i]=='0') {
state="STOP";
extend_2[i]='1';
i++;
}
System.out.print("此时编码变为:");
for(int j=0;j<extend_2.length;j++) {
System.out.print(extend_2[j]+" ");
}
System.out.println("内态为:"+state);
}
//给成员变量赋值
for(int i=0;i<extend_2.length;i++) {
extend_3+=extend_2[i];
}
}
/**
*
* @Title:Result
* @Description:TODO
* @param extend_4字符串数组容器,存放转换后的伸缩扩展二进制编码
* @param result 最后的结果
* @return void
* @throws
*/
public void Result() {
char[]extend_4=extend_3.toCharArray();
//将伸缩扩展二进制变为二进制
for(int i=0;i<extend_4.length;) {
if(extend_4[i]=='1'&&extend_4[i+1]=='0') {
binary_3+="1";
i+=2;
}
else if(extend_4[i]=='0') {
binary_3+="0";
i+=1;
}
else if(extend_4[i]=='1'&&extend_4[i+1]=='1') {
i+=2;
}
}
System.out.println("转化后二进制为:"+binary_3);
int result=Integer.parseInt(binary_3,2);//将二进制转换为十进制
System.out.println("转化后十进制结果为:"+result);
}
}
//Turing.java
/**
*
* @author lenovo青山不改旧
* Apr 13, 2021
* @Classname:Turing
* @Description:TODO用来调用图灵机
*
*/
public class Turing {
/***
*
* @Title:main
* @Description:TODO主函数
* @param @param args
* @return void
* @throws
*/
public static void main(String[] args) {
// TODO 自动生成的方法存根
Counting tra=new Counting ();
tra.convert();
tra.process();
tra.Result();
}
}
运行结果