2021-04-09

C++实现XN×2图灵机模拟

算法分析

1.首先需要完成数的进制转换,将二进制数转化成十进制数,如何转化呢,这里采用除二取余的方法,这种方法就是不断得到余数,放进数组arr[],最后除以颠倒一下就行了。
2.转换成拓展二进制编码,规则就是1->10,0->0, ,->变成110,为了方便计算,后面可以多加几个0,第一位一定是0
3.将XN×2的六条指令输入进去判断里面,然后将转化好的拓展二进制编码输入循环系统进行判断,到了STOP就退出循环,结束运算。

流程图:
在这里插入图片描述

代码实现

下面展示一些 代码



```C++
#include<iostream>
using namespace std;
int main()
{
	int n,i,j;
	int temp,k,len;
	int m=0;
	int a[20],arr[20];
	int flag=0;
	cout<<"请输入一个正整数";
	cin>>n;
	while(n>0)
	{
		arr[i]=n%2;      //获取余数,计算二进制结果 
        n=n/2;
        i++;
	}
	k=i;
	for(j=0;j<i/2;j++)
	{
		temp=arr[j];
        arr[j]=arr[i-j-1];
        arr[i-j-1]=temp;
	}
	cout<<"正整数转换为二进制的结果为:";
    for(i=0;i<k;i++)
    {
    	cout<<arr[i];
	}
	cout<<"扩展的二进位编码为:"<<endl;//扩展的二进位编码
	for(j=0;j<k;j++)
	{
		if(arr[j]==1)
		{			
			if(j==0)
			{	a[m]=0;
				m++;
				a[m]=arr[j];
				m++;
				a[m]=0;
			}
			else
			{
				a[m]=arr[j];
				m++;
				a[m]=0;
			}
		m++;
		}
			else if(arr[j]==0)
			{			
				a[m]=arr[j];
				m++;
			}	
	}
	int array[6]={1,1,0,0,0,0};//{1,1,0}表示逗号,为了计算方便需要在后面多加一些0 
	for(int x=0;x<6;x++)
	{
		a[m++]=array[x];
	}
	len=m+1;
	for (m=0; m<len; m++)      
	{
		if (a[m] == 0 || a[m] == 1)
		{
			cout<< a[m];    //输出a[]
		}
	}

	cout<<endl;	
	int count=0; 
	for(i=0;i<m;i++)
	{
	
		if(flag==0&&a[i]==0)          // 内态为0输入为0时,內态变为0输入变为0
		{
			flag=0;
			a[i]=0;
			count++;
			
		}
		else if(flag==0&&a[i]==1)      //内态为0输入为1时,内态变为1输入变为0
		{
			flag=1;
			a[i]=0;
			count++;
			
		}
		else if(flag==1&&a[i]==0)       //内态为1输入为0时,内态变为0输入变为1
		{
			flag=0;
			a[i]=1;
			count++;
			
		}
		else if(flag==1&&a[i]==1)         //内态为1输入为1时,内态变为10输入变为0
		{
			flag=10;
			a[i]=0;
			count++;
			
		}
		else if(flag==10&&a[i]==0)      //内态为10输入为0时,内态变为11输入变为1
		{
			flag=11;
			a[i]=1;
			count++; 
		}
		else if(flag==10&&a[i]==1)      //内态为10输入为1时,内态变为0输入变为0
		{
			flag=0;
			a[i]=0;
			count++;
			
		}
		else if(flag==11&&a[i]==0)      //内态为11输入为0时,内态变为0输入变为1
		{
			flag=0;
			a[i]=1;
			count++;
			
		}
	    else if(flag==11&&a[i]==1)      //内态为11输入为1时,内态变为0输入变为0
		{
			flag=0;
			a[i]=0;
			count++;
			
		}
		cout<<"第";
		cout<<count;
		cout<<"次";
		
		cout<<"运行结果:"; 
	    for(j=0;j<m;j++)
	    {
	    
		
		    cout<<a[j];
	    }
	    cout<<endl;
	 } 
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值