内容:
1.算法分析
对于XN+1或XN2图灵机进行模拟,任意给定的十进制数a,转换为收缩扩展二进制的编码,再编程模拟此Turing机的运行过程,要求输出从开始运行起的每一步骤的结果。 用C或C++或java或python语言实现程序解决问题。
在这里先要将正整数转换为二进制数,再进行进行扩展,图灵机(XN×2)在扩展的二进位上实现运算。设置两个字符数组,一个放置原二进制,一个放置运算后的结果。通过if-else嵌套语句根据内态和读入的字符完成读写,输出每轮运行结果最后输出最终的结果。
2.图灵机XN2运算指令为:
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。
2.概要设计(包括数据结构及算法绘制流程图或伪代码表示)
package Tulingji;
import java.util.Scanner;
public class Turing {
public static void main(String[] args){
System.out.print("输入一个十进制数:");
Scanner sc = new Scanner(System.in);
int m=sc.nextInt();
Data t=new Data();
t.trans(m);
System.out.print("转化二进制为:");
System.out.println(t.data);
t.extend();
System.out.print("进行扩展后为:");
System.out.println(t.data);
System.out.println("运算过程实现:");;
t.tuling_XN2();
System.out.print("转化为二进制:");
t.restore();
System.out.print("化为十进制:"+t.power());
}
}
class Data{
public char[] data=new char[100]; //定义存放原二进制的字符数组
public char[] value=new char[100]; //定义存放计算结果的字符数组
public int length=0;
public int leng=0;
public char[] arr= {'0','1','1','0'};
public boolean stop=false;
void trans(int m){ //整数转二进制
int i=0;
char temp;
while(m!=0){ //除余2,循环此过程,直到0
if(m%2==0)
data[i]='0';
else
data[i]='1';
i++;
m=m/2;
}
for(i=0;i<data.length;i++){
if(data[i]!='\0') length++;
else break;
}
for(i=0;i<length/2;i++){
temp=data[i];
data[i]=data[length-1-i];
data[length-1-i]=temp;
}
}
void extend(){
for(int i=0;i<length;i++){
if(data[i]=='1'){
for(int j=length;j>i;j--)
data[j+1]=data[j];
data[i]='0';
data[i+1]='1';
length++;
i++;
}
}
for(int i=0;i<arr.length;i++) {
data[length++]=arr[i];
}
}
void tuling_XN2() {
int i=0;
String str;
String s="0";
while(!stop) {
str=String.valueOf(data, 0, length);
System.out.println(i+1+":"+str+" 内态:"+s+",输入;"+data[i]);
if(data[i]=='0') {
if(s=="0") {
s="0";
data[i]='0';i++; //0 0->0 0 R
}else if(s=="1") {
s="0";
data[i]='1';i++; //1 0->0 1 R
}else if(s=="10") {
s="11";
data[i]='1';
data[i+1]='0';i++;length++; //10 0->11 1 R
}else if(s=="11") {
s="0";
data[i]='1';
data[i+1]='0';
stop=true;i++;length++; //11 0->0 1 STOP
}
}else {
if(s=="0") {
s="1";
data[i]='0';i++; //0 1->1 0 R
}else {
s="10";
data[i]='0';i++; //1 1->10 0 R
}
}
}
str=String.valueOf(data, 0, length);
System.out.println("最终结果" +":"+str);
}
void restore() { //转化为二进制
int j=0;
for(int i=1;i<length;i++) {
if(data[i]=='1') {
if(data[i+1]=='1')
break;
else {
value[j]='1';j++;leng++;
}
}else if(data[i]=='0'&&data[i+1]=='0') {
value[j]='0';j++;leng++;
}
}
System.out.println(value);
}
int power() {
int sh=0;
for(int i=0;i<leng;i++) {
if(value[i]=='1')
sh+=(int)Math.pow(2, leng-1-i);
}
return sh; //输出十进制
}
}