图灵机XN*2

内容:
1.算法分析
对于XN+1或XN2图灵机进行模拟,任意给定的十进制数a,转换为收缩扩展二进制的编码,再编程模拟此Turing机的运行过程,要求输出从开始运行起的每一步骤的结果。 用C或C++或java或python语言实现程序解决问题。
在这里先要将正整数转换为二进制数,再进行进行扩展,图灵机(XN×2)在扩展的二进位上实现运算。设置两个字符数组,一个放置原二进制,一个放置运算后的结果。通过if-else嵌套语句根据内态和读入的字符完成读写,输出每轮运行结果最后输出最终的结果。
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。
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;  //输出十进制
} 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值